And*_*Gis 8 .net c# task task-parallel-library async-await
看看这段代码:
private async Task InnerTask(bool outerTaskResult)
{
Console.WriteLine("2");
await Task.Factory.StartNew(() => Thread.Sleep(10000));
Console.WriteLine("3");
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Task<Task> aggregatedTask = task.ContinueWith(task1 => InnerTask(task1.Result));
Console.WriteLine("1");
await aggregatedTask;
Console.WriteLine("4");
}
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
但我得到:
1
2
4
3
Run Code Online (Sandbox Code Playgroud)
这可能与在不同线程上执行的InnerTask有关.
我正在使用ContinueWith,因为原始代码中的任务是以这种方式动态创建和排队的.
使用.Wait()方法(见下文)有效,但我认为这是一个坏主意,因为该方法是阻塞的.
task.ContinueWith(task1 => InnerTask(task1.Result).Wait())
Run Code Online (Sandbox Code Playgroud)
这里的正确方法是什么?
您可以使用TaskExtensions.Unwrap()(这是一个扩展方法Task<Task>)来解开outter任务并检索内部任务:
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Task aggregatedTask = task.ContinueWith(task1 => InnerTask(task1.Result)).Unwrap();
Console.WriteLine("1");
await aggregatedTask;
Console.WriteLine("4");
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了简化整个过程,ContinueWith您可以await执行以下任务,而不是样式延续:
private async void Button2_Click(object sender, RoutedEventArgs e)
{
var task = Task.FromResult(false);
Console.WriteLine("1");
var result = await task;
await InnerTask(result);
Console.WriteLine("4");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4240 次 |
| 最近记录: |