我正在尝试熟悉 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
在异步函数之外不起作用。为什么?