例如,此代码之间有什么区别:
public async Task DoSomething(int aqq)
{
await DoAnotherThingAsync(aqq);
}
和这一个:
public Task DoSomething(int aqq)
{
DoAnotherThingAsync(aqq);
}
他们都是正确的吗?
答案 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)
,以了解其中的差异。注意:这只是一个想法,而是重写第一种方法更复杂。我只是想告诉你你的变种不相似。