gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:09:06 27 4
gpt4 key购买 nike

我正在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com