C# 异步任务和任务之间的区别是什么
例如,此代码之间的区别是什么:C# 异步任务和任务之间的区别是什么,c#,async-await,task-parallel-library,C#,Async Await,Task Parallel Library,例如,此代码之间的区别是什么: public async Task DoSomething(int aqq) { await DoAnotherThingAsync(aqq); } 还有这个: public Task DoSomething(int aqq) { DoAnotherThingAsync(aqq); } 它们都正确吗?如果使用得当,两个签名都是正确的 async Task允许您在方法中使用wait关键字。第一个例子完全可以 第二个示例缺少return语句: pu
public async Task DoSomething(int aqq)
{
await DoAnotherThingAsync(aqq);
}
还有这个:
public Task DoSomething(int aqq)
{
DoAnotherThingAsync(aqq);
}
它们都正确吗?如果使用得当,两个签名都是正确的
async Task
允许您在方法中使用wait关键字。第一个例子完全可以
第二个示例缺少return语句:
public Task DoSomething(int aqq)
{
return DoAnotherThingAsync(aqq);
}
使用第二个签名时,您不能使用wait关键字,但仍然可以返回从其他地方获得的任务,例如,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,那么实际上就是在等待任务完成。返回任务不会等待任务完成。在您的示例中,不会。您的第二种方法会破坏任务链,这是完全错误的,可能会导致难以发现的错误和奇怪的行为
如果未使用async
(自动处理返回),则需要返回任务
在调试和一些其他问题时,还有一些细微的差别是很重要的,但这是一个相当广泛的主题:)在您完全理解这个问题之前,只需使用async和Wait,它们是目前C中可用的最高级别的工具。是的,它们都是正确的,但第二个更好
Async关键字只是一种语法糖,它允许我们编写线性代码,而不是奇怪的手动处理任务
第一个变量被编译到状态机中,结果是它比第二个变量花费的时间多一点。您甚至可以将第一个变量重写为return Task.Run(()=>DoAnotherThingAsync(aqq.Result)
,以了解差异在哪里。注意:这只是一个想法,而重写第一个方法更复杂。我只是想告诉你们,你们的变种并不相似
您可以在文章中阅读更多关于异步工作原理的信息您是对的,第一种情况将被重写为状态机,并且它有一个成本(当然,如果您处理的是真实的I/O代码,与您正在尝试做的工作相比,这个成本很可能很小,但没有问题)。然而,使用Task.Run
和wait
之间没有相似之处,这完全是误导。要么澄清你想说的话,要么放弃索赔。@Luaan是的,你是对的。添加了澄清以防止误导。我将此标记为副本。另一个问题与你的问题不完全相同,但答案同样适用。