C# 正在等待最后一个方法调用
一些关于堆栈溢出的帖子建议如下: 任何异步方法,如果有一个等待表达式等待一个任务或任务C# 正在等待最后一个方法调用,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,一些关于堆栈溢出的帖子建议如下: 任何异步方法,如果有一个等待表达式等待一个任务或任务,就在方法的末尾,没有进一步的处理,那么最好不使用async/await编写 这个建议只是针对特殊情况吗?在web服务器上,使用async/await的主要原因不是因为在等待下面的UpdateDataAsync方法时,线程将返回线程池,允许服务器处理其他请求吗 如果DB update调用是方法中的最后一个调用,SaveDataAsync是否应该等待该DB update调用 public async Task
async/await
的主要原因不是因为在等待下面的UpdateDataAsync
方法时,线程将返回线程池,允许服务器处理其他请求吗
如果DB update调用是方法中的最后一个调用,SaveDataAsync
是否应该等待该DB update调用
public async Task WorkWithDataAsync(Data data)
{
ManipulateData(data);
await SaveDataAsync(data);
await SendDataSomewhereAsync(data);
}
public async Task SaveDataAsync(Data data)
{
FixData(data);
await DBConnection.UpdateDataAsync(data);
}
另外,由于您不知道将在何处使用SaveDataAsync
,因此使其同步将损害像WorkWithDataAsync
这样的方法,不是吗 删除wait
并仅返回任务
不会使方法同步Wait
是一种使方法异步化更容易的工具。这不是使方法异步的唯一方法。它的存在是因为它允许您向任务添加continuations,这比不使用它要容易得多,但在您所展示的方法中,您实际上并没有利用wait
关键字来完成任何事情,因此,您可以删除它,并让代码以相同的方式运行
(请注意,从技术上讲,通过删除async
,异常的语义将略有改变;抛出的异常将从方法中抛出,而不是包装在返回的任务中,如果这对您很重要的话。就任何调用方而言,这是唯一可以观察到的区别。)在没有async await关键字的情况下编写这些方法不会使它们同步
其思想是直接返回任务,而不是产生状态机的开销
实际的区别在于异常处理。异步方法在返回的任务中封装异常,而简单的任务返回方法则不封装异常
例如,如果FixData抛出异常,它将在异步方法中捕获,但直接在返回异常的简单任务中抛出。这两个选项都是同样异步的 我明白了。因此,基本上,如果没有任何东西能够立即依赖于它们的完成,那么触发并忘记方法实际上不需要标记为wait
?它不是一个触发并忘记方法,因为它返回一个任务
。但是,是的,由于从您正在编写的方法返回的任务和从您正在调用的方法返回的任务应该同时完成,并且具有相同的结果,因此您最好只返回该任务,而不是创建一个新任务来包装它,它只会传播相同的值。如果您在继续执行该任务时做了比“什么都不做”更有趣的事情,wait
可能会增加价值。