【发布时间】:2020-07-07 09:06:45
【问题描述】:
在另一个async 方法中只调用一个async private 方法和await 是否有意义?
示例:
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...
}
在上面的场景中,我猜,即使 ReadMyFileAsync 方法在其同步版本中被调用(不使用 async 并且使用 ReadToEnd() 而不是 await ReadToEndAsync()),它也会保持相同的行为, 因为调用者方法是一个async 方法。这意味着在我看来,这只有在我尝试并行读取多个文件时才有意义(参见以下示例),对吗?
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...
}
所以问题很简单,在第一段代码中,我调用ReadMyFileAsync 还是ReadMyFile 有什么区别吗?
更新:整个问题简化为:
如果我要在我的异步方法OnFileChangedHandler 中等待异步方法ReadMyFileAsync,我为什么要使用ReadMyFileAsync 而不是ReadMyFile?
【问题讨论】:
-
对不起,我不明白这个问题。您是在问单行方法是否有意义?
-
这是一个有趣的问题,我的直觉告诉我,不,由于您所描述的原因,这样做是没有意义的。两个 await 最终都会等待同一个工作。
-
@ZoharPeled,感谢您的反馈,我在底部添加了一行,并在第一个代码块中添加了一个同步版本的方法。我希望现在更清楚了。
-
关于这个主题有整本书。这是快速google search 和旧Jon Skeet one 的结果
-
@Liam 我认为 nvoigt 的回答是回答“我应该等待我的异步方法还是应该将任务传递下去”的问题。虽然问题更多的是“我为什么更喜欢 DoXXXAsync 而不是 DoXXX”
标签: c# .net asynchronous async-await