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

Aym*_*udi 4 .net c# asynchronous multitasking async-await

当我在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();
Run Code Online (Sandbox Code Playgroud)

案例2: 回复

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

我想理解这一点,我想我错过了一些东西.

svi*_*ick 5

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

如果你想继续使用await,或者可能ContinueWith().两者都具有可组合的优点:被调用者只返回一个Task,然后调用者决定用它做什么.

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

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