异步任务和任务之间有什么区别

时间:2016-06-30 11:03:20

标签: c# async-await task-parallel-library

例如,此代码之间有什么区别:

public async Task DoSomething(int aqq)
{
    await DoAnotherThingAsync(aqq);
}

和这一个:

public Task DoSomething(int aqq)
{
    DoAnotherThingAsync(aqq);
}

他们都是正确的吗?

3 个答案:

答案 0 :(得分:0)

如果使用得当,两个签名都是正确的。

async Task允许您在方法中使用await关键字。第一个例子完全没问题。

第二个示例缺少return语句:

public Task DoSomething(int aqq)
{
   return DoAnotherThingAsync(aqq);
}

使用第二个签名你不能使用await关键字,但你仍然可以返回一些任务,你从其他地方获得,例如,Task.FromResult(true);

为了给你另一个区别,请考虑以下示例:

public async Task DoSomething1(int aqq)
{
    await DoAnotherThingAsync(aqq); //blocks here and wait DoAnotherThingAsync to respond
    SomethingElse();
}


public Task DoSomething2(int aqq)
{
    var task = DoAnotherThingAsync(aqq); //keep going here, not waiting for anything
    SomethingElse();
    return task;
}

public async Task DoAnotherThingAsync(int aqq)
{
    await Task.Delay(100);
}

public void SomethingElse()
{
    //do something
}

如果您正在使用async / await,那么您实际上正在等待任务完成。返回任务不会等待任务完成。

答案 1 :(得分:0)

在你的样本中,没有。你的第二种方法打破了任务链,这是完全错误的,并且很难找到整体上的错误和奇怪的行为。

如果你没有使用async(自动处理你的回复),你需要返回任务。

在调试和其他一些问题时,还有一些微妙的差异非常重要,但这是一个相当广泛的主题:)直到你完全理解这个问题,只需使用async和await - 它们是C#中可用的最高级工具这一点。

答案 2 :(得分:-2)

是的,他们都纠正了,但第二个更好。

Async关键字只是一种语法糖,它允许我们编写线性代码而不是奇怪的手动处理任务。

第一个变体被编译到状态机中,结果是它比第二个变体需要更多的时间。您甚至可以将第一个变体重写为return Task.Run(() => DoAnotherThingAsync(aqq).Result),以了解其中的差异。注意:这只是一个想法,而是重写第一种方法更复杂。我只是想告诉你你的变种不相似。

您可以在文章"Async Await and the Generated StateMachine"

中详细了解异步的工作原理