Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在等待最后一个方法调用_C#_.net_Asynchronous_Async Await - Fatal编程技术网

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编写

这个建议只是针对特殊情况吗?在web服务器上,使用
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
可能会增加价值。