任务回调与OnCompleted()之间的区别

时间:2013-12-25 12:14:24

标签: c# .net asynchronous async-await multitasking

当我在C#上玩任务时,我想知道使用GetAwaiter()之间有什么区别.OnCompleted()和回调

案例1: task1.GetAwaiter()。OnCompleted()

Task task1 = new Task(() =>
            {
                //Do Work_1 here
            });

task1.GetAwaiter().OnCompleted(() =>
            {
                //Do something here where Work_1 Completed 
            });

task1.Start();

案例2: CallBack

await Task2(() =>
            {
                //CallBack                            
            });
private async Task Task2(Action callBack)
            {
               //do Work_2 here
               await Task.Run(callBack);
            }

我想理解这一点,我想我错过了什么。

1 个答案:

答案 0 :(得分:5)

在讨论差异之前,我必须指出一件事:你不应该使用这两种方法中的任何一种GetAwaiter()在内部使用await,它在某些专门的代码中很有用,但您不应在普通代码中使用它。持续行动正是async - await试图避免的行为。

如果您想要续,请使用awaitContinueWith()。两者都具有可组合的优点:被调用者只返回Task,然后调用者决定用它来做什么。

话虽如此,但存在一些差异:

  • 在案例1中,即使Task失败,也会继续运行。
  • 在情况1中,继续将在当前同步上下文(如果有)上运行。在案例2中,延续将始终在线程池线程上运行。