是否可以强制 async-await 语句的继续在自定义 ThreadPool 的线程上运行?
上下文:我正在运行一个 ASP 应用程序并在后台做很多工作。我通过自己编写的 ThreadPool 完成所有工作,但如果我使用异步等待模式,则延续始终在名为“Worker Thread”的线程上运行。 我很确定这是来自默认 ThreadPool 的线程,它也用于处理 HTTP 请求。 这会导致这些请求饥饿,因为默认 ThreadPool 的所有线程都忙于继续我的后台工作。
最佳答案
是的。您可以创建自定义 SynchronizationContext
它适用于您的自定义 ThreadPool
并在运行异步操作之前设置它。
var prevCtx = SynchronizationContext.Current;
try
{
SynchronizationContext.SetSynchronizationContext(new ThreadPoolSynchronizationContext());
// async operations.
}
finally
{
SynchronizationContext.SetSynchronizationContext(prevCtx);
}
有关如何创建自定义 SynchronizationContext
的更多信息:Await, SynchronizationContext, and Console Apps
尽管很少需要自定义线程池。您可能应该尝试在使用内置优化器的同时进行优化。
关于c# - 使用自己的线程池继续任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959348/