线程的await/async有何不同?我试图熟悉c#的新await/async关键字,但我发现了几个我无法理解的方面。让我们从竞争条件开始:Streams=......for(inti=0;i<100;i++){s.WriteAsync(newbyte[]{i},0,1);这将按预期工作(例如写入文件12345.....而不是13254或其他东西)?第二件事是,如果异步函数不包含await运算符,它们将同步执行。此外,根据微软文档,异步函数始终在调用者线程中执行(与BeginInvoke相比)。这带来了接下来的3个问题:异步函数在被释放给调用函数之前执行了多少?asyncvoidMyAsyncFunction(){Operation1();操作2();操作3();....流s=...;等待s.WriteAsync(....);在我读到的关于await/async的文章中,说没有await运算符的async函数是顺序执行的,async/await立即返回。但我在唠叨MyAsyncFunction可能总是在释放之前执行Operation1...Operation3,因为它会触发awaits.WriteAsync。如果我在这样的异步函数中使用Thread.Sleep:asyncvoidDoStuff(){Streams=...;...等待s.WriteAsync(....);线程.睡眠(10000);....}Thread.Sleep会阻塞执行它的整个线程还是只阻塞异步函数?如果我在其中一个异步函数中使用semaphore.Wait()并且它期望信号量被另一个异步函数释放怎么办?这会表现得像一个线程,还是会导致死锁?await在异步函数之外无效。为什么?我建议您阅读我对异步的介绍。这会按预期工作吗(例如写入文件12345.....而不是13254或其他东西)?不必要。您需要等待对WriteAsync的调用。异步函数在释放给调用函数之前执行了多少?直到它等待尚未完成的操作。Thread.Sleep会阻塞执行它的整个线程还是只阻塞异步函数?Thread.Sleep-以及所有其他阻塞方法-将阻塞异步方法和执行它的线程。作为一般规则,不要在异步方法中使用任何阻塞方法。如果我在其中一个异步函数中使用semaphore.Wait()并且它期望信号量由另一个异步函数释放怎么办?这会表现得像一个线程,还是会导致死锁?这完全取决于您的背景。Wait是一种阻塞方法,所以如果“其他”异步方法需要阻塞方法持有的上下文,那么你就会死锁。请注意,SemaphoreSlim是异步友好的;您可以使用WaitAsync而不是Wait。await在异步函数之外无效。为什么?因为async关键字启用了await关键字。这样做是为了尽量减少新关键字对C#语言和代码可读性的影响。您可以在EricLippert的以下文章中找到有关await运算符问题的答案,他在文中说:“await”运算符...并不意味着“此方法现在阻塞当前线程,直到异步操作返回”。这会将异步操作返回到同步操作,这是我们试图避免的。相反,它的意思相反;这意味着“如果我们正在等待的任务尚未完成,则将方法的其余部分注册为该任务的延续,然后立即返回给您的调用者;任务将在被调用时继续。——埃里克·利珀特简而言之,似乎答案是“非常”。虽然以下可能无法回答您的所有问题,但我认为它适用于一般用例。想想您的Streams而不是它们指的是网络IO。在重叠网络IO的情况下,将使用IO完成端口,回调由硬件中断触发。这意味着当我们“等待”完成时,不会消耗任何线程。[…]可以在1个线程中执行所有操作都在.[…]但是,这将取决于平台、“等待者”实现和所使用的同步上下文。http://social.msdn.microsoft.com/Forums/en-US/async/thread/a46c8a54-f8d4-4fa9-8746-64d6a3a7540d/以上是C#学习教程:线程的wait/async有何不同?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
