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