c# - 将异步回调与 Task.ContinueWith 结合使用

标签 c# async-await

我正在尝试使用 C# 的 async/await/continuewith。 我的目标是必须有 2 个并行运行的任务,尽管哪个任务按顺序执行一系列操作。 为此,我计划有一个 List<Task>表示并行运行的 2 个(或更多)任务,并使用 ContinueWith在每个 Task 我的问题是在 await taskList 期间似乎没有执行回调已经回来了。

为了总结,这里有一个示例来说明我期望发生的事情:

class Program
{
    static public async Task Test()
    {
        System.Console.WriteLine("Enter Test");
        await Task.Delay(100);
        System.Console.WriteLine("Leave Test");
    }

    static void Main(string[] args)
    {
        Test().ContinueWith(
        async (task) =>
        {
            System.Console.WriteLine("Enter callback");
            await Task.Delay(1000);
            System.Console.WriteLine("Leave callback");
        },
        TaskContinuationOptions.AttachedToParent).Wait();
        Console.WriteLine("Done with test");
    }
}

预期的输出是

Enter Test
Leave Test
Enter callback
Leave callback
Done with test

然而,输出是

Enter Test
Leave Test
Enter callback
Done with test

有没有办法让 ContinueWith 上的任务被称为等待提供的功能完成之前被认为是完成? IE。 .Wait 将等待两个任务完成,原始任务和由 ContinueWith 返回的任务

最佳答案

使用 ContinueWith 链接多个任务时方法,您的返回类型将为 Task<T>T是传递给 ContinueWith 的委托(delegate)/方法的返回类型.

因为异步委托(delegate)的返回类型是 Task ,你最终会得到一个 Task<Task>并最终等待异步委托(delegate)返回给你 Task这是在第一个 await 之后完成的.

为了更正此行为,您需要使用返回的 Task , 嵌入您的 Task<Task> .使用 Unwrap 提取它的扩展方法。

关于c# - 将异步回调与 Task.ContinueWith 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697167/

相关文章:

c# - 如何在更新面板中打开模态弹出窗口?

c# - 如何检查匿名对象属性是否不为空 C#

c# - EF DB 首次刷新未检测到特定表的 FK

c# - 为什么我没有收到任何错误,但数据库没有插入记录?

c# - 从异步方法返回输出时推荐的方法签名?

c# - 同时多个 AJAX 请求会减慢 ASP.NET WEB API

delay - .Net 4.5 和 Task.Yield vs Task.Delay 作为 DoEvents 的替代品?使用哪个?

flutter - 等待多个级别的 future ?

c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?

c# - Asp .NET 从 tar.gz 存档中读取文件