Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 只调用一个'async'方法并在另一个'async'方法中调用'await'方法有意义吗?_C#_.net_Asynchronous_Async Await - Fatal编程技术网

C# 只调用一个'async'方法并在另一个'async'方法中调用'await'方法有意义吗?

C# 只调用一个'async'方法并在另一个'async'方法中调用'await'方法有意义吗?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,只调用一个asyncprivate方法并在另一个async方法中等待它是否有意义? 例如: 所以问题很简单,在第一段代码中,调用ReadMyFileAsync还是ReadMyFile有什么区别吗? 更新:整个问题简化为: 如果我要在异步方法中等待异步方法ReadMyFileAsync,我为什么要在ReadMyFile上使用ReadMyFileAsync。如果您确实只调用了另一个方法,并且没有副作用,那么您可以返回任务,而不是等待它并返回包装在任务中的结果 然而,即使在你的例子中,你也有副作用。你

只调用一个
async
private
方法并在另一个
async
方法中等待它是否有意义? 例如:

所以问题很简单,在第一段代码中,调用
ReadMyFileAsync
还是
ReadMyFile
有什么区别吗?

更新:整个问题简化为:
如果我要在异步方法中等待异步方法
ReadMyFileAsync
,我为什么要在
ReadMyFile
上使用
ReadMyFileAsync
。如果您确实只调用了另一个方法,并且没有副作用,那么您可以返回
任务
,而不是
等待它并返回包装在任务中的结果

然而,即使在你的例子中,你也有副作用。你需要
.Dispose
一些东西,你需要知道什么时候做。因此,您不能只返回任务,您需要等待任务完成,然后处置资源,然后返回已完成任务的结果。因为即使在您自己的简化示例中,它也“没那么简单”,所以答案是:它确实有意义。你必须逐案决定


有时您可以直接传递任务,然后该方法根本不需要是
异步的
,它只需要返回一个
任务
,有时您需要根据任务的时间来做一些事情(即,只有在其他事情完成后才这样做)然后你需要使用
async
方法,因为你想
等待
结果。

是的,你应该更喜欢
async
方法而不是sync,因为async方法不会阻塞正在执行的线程。在UI应用程序中,这意味着UI不会冻结。在服务器应用程序中,这意味着您的服务器将能够运行更多并发工作,而不会导致线程不足。

对不起,我不理解这个问题。你是在问单线法是否有意义吗?这是一个有趣的问题,我的直觉告诉我,不,因为你所描述的原因,这样做没有意义。两个等待最终将等待相同的工作。@ZoharPeled,感谢您的反馈,我在底部添加了一行,并在第一个代码块中添加了该方法的一个同步版本。我希望现在情况更清楚了。关于这个问题,已经有很多书了。这里是一个快速而好的老@Liam的结果,我认为nvoigt回答了一个“我应该等待异步方法还是应该传递任务”的问题。虽然问题更多的是“为什么我应该选择DoXXXAsync而不是DoXXX”谢谢您的回答,但实际上我的案例的要点位于您的第一行:在我的代码的第一个块中调用私有方法的sycn或异步版本(ReadMyFile或ReadMyFileAsync)有什么区别吗?(我在第一个块中添加了一些代码)。我会说不,因为完成这项工作所花费的时间将保持不变。还是我遗漏了什么?当然忽略了我的例子中的副作用。我添加了一个小的更新,简化了整个问题,你能看一下吗?在我的简单答案后面隐藏着一篇10页的文章。在某些情况下,将返回的内容设置为可以等待的任务具有优势。但是,如果您没有这些场景,请不要使用不必要的异步/等待调用使代码复杂化。换句话说:如果正常工作,不要刻意使其异步。@nvoigt在编写大型应用程序时,使用get go中的异步方法是有意义的,因为否则您会发现自己处于需要将整个方法链重构为异步的情况。此外,现代.net支持异步无处不在,包括cli应用程序。所以,在任何地方都使用async并不难。@MohammedNoureldin您的意思是在异步函数中调用sync方法和async有什么区别?嗯,将
async
添加到方法定义中并不会使方法异步。如果此方法中只有同步调用,则整个方法将是同步的。@MohammedNoureldin它的工作方式不同。Sync方法将使执行线程休眠,而不执行任何操作<代码>等待
将安排继续。线程可能在等待时做其他工作。这是一个非常广泛的概括。async/await模式本身带来了很多困难,如果简单的同步调用适用于您的情况,那么为应用程序增加复杂性是没有意义的。在现代.net中,使用async一点也不困难。如今,每一个现代项目结构都支持甚至在任何地方强制执行异步。您假设
async
是免费的。不是。异步在线程同步方面有成本。如果在CPU繁忙的情况下执行CPU限制的处理,那么线程利用率成本只会使代码变慢。异步/等待是IO绑定操作的正确答案。但您不能简单地声明使用异步。问题是,这要看情况而定
private async Task<string> ReadMyFileAsync()
{
    var streamReader = new StreamReader(@"c:\myFile.txt")

    return await streamReader.ReadToEndAsync(); // <-- Does it make sense for me here to await for only onething, while the caller of the method ReadMyFileAsync is already an async method?
    // By ignoring that the stream should be disposed...
}

private string ReadMyFile()
{
    var streamReader = new StreamReader(@"c:\myFile.txt")

    return streamReader.ReadToEnd();
    // By ignoring that the stream should be disposed...
}

public async void OnFileChangedHandler()
{
    // Some work...
    var myText = await ReadMyFileAsync(); <-- Does it make any difference whether I  called `await ReadMyFileAsync()` or `ReadMyFile()`?

    var someThingElse = await SomeThingElse(...);
    // Some work...
}
private async Task<string> ReadMyFileAsync() // <-- This makes sense for me
{
    var streamReader1 = new StreamReader(@"c:\myFile1.txt");
    var streamReader2 = new StreamReader(@"c:\myFile2.txt");
    var streamReader3 = new StreamReader(@"c:\myFile3.txt");

    var myText1Task = streamReader1.ReadToEndAsync();
    var myText2Task = streamReader2.ReadToEndAsync();
    var myText3Task = streamReader3.ReadToEndAsync();

    return await myText1Task + await myText2Task + await myText3Task;

    // By ignoring that the streams should be disposed...
}