gpt4 book ai didi

c# - 异步 I/O 方法是如何处理的

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:32 24 4
gpt4 key购买 nike

在阅读了很多关于异步等待的内容之后,我只能发现在 GUI 线程 (WPF/WinForms) 中使用它的好处。

在什么场景下减少WCF服务中线程的创建?程序员是否必须通过选择在 Web 服务中实现异步等待来在服务中对每个方法使用异步等待?在充满异步等待的服务中制作一些非异步等待方法会降低我的服务效率?怎么办?

最后一个问题 - 有人说使用“await Task.Run(()=>...)”不是“真正的异步等待”。他们这么说是什么意思?

提前致谢,稳定。

编辑:

这两个答案都很好,但对于关于 async-await 如何工作的更深入的解释,我建议在这里阅读@Stephen Cleary 的回答: https://stackoverflow.com/a/7663734/806963

要理解他的回答,需要以下主题:SynchronizationContext,SynchronizationContext.Current,TaskScheduler,TaskScheduler.Current,Threadpool.

最佳答案

异步/等待在服务器应用程序(如 WCF)中的真正好处是异步 I/O。

当您调用同步 I/O 方法时,调用线程将被阻塞以等待 I/O 完成。该线程不能被其他请求使用,它只是等待结果。当更多的请求到来时,线程池会创建更多的线程来处理它们,浪费大量的资源——内存,等待线程解锁时的上下文切换……

如果你使用async IO,线程不会被阻塞。启动异步IO操作后,就可以再次被线程池使用了。当异步操作完成后,线程池分配一个线程继续处理请求。没有资源浪费。

来自 MSDN (它是关于文件 I/O,但也适用于其他)

In synchronous file I/O, a thread starts an I/O operation and immediately enters a wait state until the I/O request has completed. A thread performing asynchronous file I/O sends an I/O request to the kernel by calling an appropriate function. If the request is accepted by the kernel, the calling thread continues processing another job until the kernel signals to the thread that the I/O operation is complete. It then interrupts its current job and processes the data from the I/O operation as necessary.

现在您可能明白为什么如果任务中的 IO 是同步完成的,await Task.Run() 不会带来任何好处。线程无论如何都会被阻塞,只是调用 Task.Run() 的线程不会被阻塞。

您不需要异步实现每个方法就能看到性能的提高(尽管始终异步执行 I/O 应该成为一种习惯)。

关于c# - 异步 I/O 方法是如何处理的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com