你会在线程池线程上使用await关键字吗?

3
如果您决定通过将一些CPU密集型代码放入任务并在线程池中运行来卸载UI线程,那么这段代码本身会受益于使用“await”关键字吗?
看起来答案似乎是否定的。
我的意思是,在UI线程中等待任务的主要原因之一是释放UI线程以执行其之前正在执行的操作。如果您在线程池上运行时等待任务,那么您正在释放该线程做什么呢?
我是否漏掉了一些非常明显的东西?
1个回答

3
如果您决定通过将一些CPU密集型代码放入任务中并在线程池中运行它来卸载UI线程,那么这段代码本身是否会受益于使用“await”关键字呢?仅仅是为了一个CPU密集型任务?也许不会。但这并不是在线程池线程中运行代码的唯一原因。考虑一个Web服务器-所有请求都将在线程池线程中处理...并且在处理这些请求时使用await(例如,在等待数据库或其他Web服务响应时)可以在非常少的线程上处理数百万个请求。此外,即使在丰富的GUI场景中,您可能仍希望将一些长时间运行的任务放到线程池线程上,但仍从该线程启动多个异步请求。异步/等待的方式鼓励组合异步操作,使得无论在哪个线程上运行代码,都可以以异步方式编写您的代码。

关于:“..通过在处理这些请求时使用await(例如,在等待数据库或其他Web服务响应时),您可以在非常少的线程上处理数百万个请求”..所以假设您有线程池线程#12处理Web请求,并且它对异步数据库读取进行了等待。那么这是否意味着在“等待”时,线程#12被放回到池中,并且可以用来做其他工作? - Michael Ray Lovett
@MichaelRayLovett:是的,完全正确。 - Jon Skeet
哦天啊,所有关于TAP的讨论中都有一段完全听不懂的内容。所以当等待的任务完成时,完成代码甚至可能不会在发出await的原始线程上运行,是这样吗? - Michael Ray Lovett
@MichaelRayLovett:当然。毕竟,一个线程池线程和另一个一样好 :) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接