c# - 使用自己的线程池继续任务

标签 c# .net task-parallel-library async-await

是否可以强制 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/

相关文章:

c# - 使用 Twitterizer 回复推文

c# - 如果未处理 StreamWriter,MemoryStream.ToArray() 返回空数组

C# 字体类设计

c# - 协变分配不起作用

c# - 如何在 Autofac InterceptorSelector 的构造函数中使用具有参数的拦截器

c# - 比较 2 字符串

C# 程序找不到可以通过在字符之间添加 ' . ' 从单词生成的单词?

c# - 从任务继续写入 ASP.NET 响应输出流

c# - 用于 TPL 数据流的 BroadcastCopyBlock 保证交付

c# - 如何使用 c#.net 4.0 在最大定义的并行线程中运行任务