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是的,你是对的。添加了澄清以防止误导。我将此标记为副本。另一个问题与你的问题不完全相同,但答案同样适用。