Kon*_*262 7 c# asynchronous async-await
我一直试图理解as#/ await和C#中的任务,但是尽管观看了YouTube视频,阅读文档和遵循复数课程,但仍然失败了.
我希望有人可以帮助回答这些略微抽象的问题,以帮助我的大脑.
1.为什么他们说async/await在它自己的async关键字什么都不做并且await关键字添加一个暂停点时启用'asynchonrous'方法?是不是添加了一个暂停点,强制该方法同步动作,即在继续之前完成await标记的任务.
2.显然除了事件处理程序之外你不应该使用async void,那么你如何正常调用异步方法呢?似乎为了使用await关键字调用异步方法,调用它本身的方法/类需要标记为async.我见过的所有示例都"启动"了一个带有事件处理程序的异步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");
}
Run Code Online (Sandbox Code Playgroud)
回到1.这看起来像一个同步方法.执行在到达时暂停Task.Run,因此Console.WriteLine("End of method");在任务完成之前不会执行.也许整个方法本身将在代码中触发它时异步执行?但回到2,你需要等待调用它,否则你得到消息'因为这个调用是不等的...'因此添加await将导致该执行点是同步的等等.
任何帮助理解这一点将非常感激.
是不是添加了一个暂停点,强制该方法同步动作,即在继续之前完成await标记的任务.
不,你想到的这个词是"顺序的",而不是"同步的".await导致异步顺序代码."顺序"意思是"一次一个"; "同步"意思是"阻塞直到完成".
你如何正常调用异步方法?
用await.
你如何"逃避"async/await的包装以运行该方法?
理想情况下,你没有.你一直都是异步的.现代框架(包括ASP.NET MVC,Azure Functions/WebJobs,NUnit/xUnit/MSTest等)都允许您返回返回的入口点Task.不太现代的框架(包括WinForms,WPF,Xamarin Forms,ASP.NET WebForms等)都允许async void入口点.
因此,理想情况下,您不会从同步代码中调用异步代码.如果你考虑一下异步代码是什么,这是有意义的:它的全部意义在于不阻塞调用线程,所以如果你在异步代码上阻塞调用线程,那么你首先会失去异步代码的所有好处.
也就是说,在极少数情况下您需要同步处理代码.例如,如果您正处于转换为异步的过程中,或者您受到强制您的代码同步且无法使用的库/框架的约束async void.在这种情况下,你可以使用我的文章中的一个hack褐色异步.
| 归档时间: |
|
| 查看次数: |
2305 次 |
| 最近记录: |