【发布时间】:2017-11-04 04:01:54
【问题描述】:
我一直在尝试理解 C# 中的 async/await 和 Task,但尽管观看了 youtube 视频、阅读文档和学习了复数课程,但我还是失败了。
我希望有人能够帮助回答这些稍微抽象的问题,以帮助我解决问题。
1. 为什么当 async 关键字本身什么都不做而 await 关键字添加了一个暂停点时,他们说 async/await 启用了“asynchonrous”方法?不会添加暂停点来强制方法同步执行,即在继续之前完成等待标记的任务。
2. 显然你不应该使用 async void 除了事件处理程序,那么你如何正常调用 async 方法呢?似乎为了使用 await 关键字调用异步方法,调用它的方法/类本身需要标记为异步。我见过的所有示例都使用事件处理程序“启动”了一个异步 void 方法。您将如何“逃避”这种 async/await 包装来运行该方法?
3.
public async Task SaveScreenshot(string filename, IWebDriver driver)
{
var screenshot = driver.TakeScreenshot();
await Task.Run(() =>
{
Thread.Sleep(2000);
screenshot.SaveAsFile(filename, ScreenshotImageFormat.Bmp);
Console.WriteLine("Screenshot saved");
});
Console.WriteLine("End of method");
}
回到 1. 这看起来像一个同步方法。当它到达Task.Run 时执行暂停,因此Console.WriteLine("End of method"); 在任务完成之前不会被执行。也许整个方法本身将在代码中触发时异步执行?但回到 2,您需要使用 await 调用它,否则您会收到消息“因为未等待此调用..”因此添加 await 将导致该执行点同步等等。
任何理解这一点的帮助将不胜感激。
【问题讨论】:
标签: c# asynchronous async-await