【发布时间】:2012-11-05 22:16:47
【问题描述】:
我正在尝试熟悉 c# 的新 await/async 关键字,但我发现了一些我不太了解的方面。
-
让我们从竞争条件开始:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }这会一直按预期工作吗(例如写入文件 12345..... 而不是 13254 或其他东西)?
第二件事是,如果async函数不包含await操作符,它会同步执行。而且,根据微软文档,异步函数总是在调用者线程中执行(与 BeginInvoke 相比)。这让我想到了接下来的 3 个问题:
-
异步函数在释放到调用者函数之前执行了多少?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }在我读过的关于 await/async 的文章中,据说没有 await 运算符的 async 函数是顺序执行的,而带有 async/await 的则立即返回。但令我烦恼的是,
MyAsyncFunction可能总是在释放之前执行 Operation1...Operation3,因为它击中await s.WriteAsync。 -
如果我像这样在异步函数中使用
Thread.Sleep会怎样:async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }Thread.Sleep 会阻塞执行它的整个线程还是仅仅阻塞异步函数?
如果我在其中一个异步函数中使用
semaphore.Wait()会怎样,它会期望信号量被另一个异步函数释放。这会像线程一样运行,还是会导致死锁?await在异步函数之外不起作用。为什么?
【问题讨论】:
-
您在一篇文章中问了太多问题 - 很难以连贯的方式回答所有问题。听起来您实际上应该做更多研究(例如,Visual Studio Async 主页上有大量信息),然后一次问一个特定问题。
-
嗯。 async/await 是线程。只是更有效地使用线程。
-
@JohnSaunders 见 msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx :
The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. -
@JonSkeet 我实际上阅读了很多关于这方面的内容,这些是我在阅读文档后留下的问题。但可能是,毕竟我还没有找到正确的文档。你能指点我吗?
-
@AdrianCiura 我刚刚在上面的 cmets 中引用了它
标签: c# .net multithreading async-await