【问题标题】:Difference between Task Callbacks and OnCompleted()任务回调和 OnCompleted() 的区别
【发布时间】:2014-01-13 09:24:36
【问题描述】:

当我在 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: 回调

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

我想了解这一点,但我认为我遗漏了一些东西。

【问题讨论】:

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


【解决方案1】:

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

如果您想继续,请使用await,或者可能使用ContinueWith()。两者都具有可组合的优点:被调用者只返回一个Task,而调用者决定如何处理它。

话虽如此,但还是有一些区别:

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

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2017-02-10
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多