C# 使用自己的线程池继续执行任务

C# 使用自己的线程池继续执行任务,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,是否可以强制在自定义线程池的线程上运行async Wait语句的继续 上下文:我正在运行一个ASP应用程序,并且在后台做了很多工作。我通过一个自编的线程池完成所有工作,但是如果我使用异步等待模式,那么继续操作总是在一个名为“Worker-thread”的线程上运行。 我很确定这是来自默认线程池的线程,它也用于处理HTTP请求。 由于默认线程池中的所有线程都在忙于继续我的后台工作,这导致这些请求不足。是。您可以创建与自定义线程池一起使用的自定义线程池,并在运行异步操作之前进行设置 var prev

是否可以强制在自定义线程池的线程上运行async Wait语句的继续

上下文:我正在运行一个ASP应用程序,并且在后台做了很多工作。我通过一个自编的线程池完成所有工作,但是如果我使用异步等待模式,那么继续操作总是在一个名为“Worker-thread”的线程上运行。 我很确定这是来自默认线程池的线程,它也用于处理HTTP请求。
由于默认线程池中的所有线程都在忙于继续我的后台工作,这导致这些请求不足。

是。您可以创建与自定义
线程池一起使用的自定义线程池,并在运行异步操作之前进行设置

var prevCtx = SynchronizationContext.Current; 
try 
{
    SynchronizationContext.SetSynchronizationContext(new ThreadPoolSynchronizationContext()); 
    
    // async operations.
} 
finally 
{  
    SynchronizationContext.SetSynchronizationContext(prevCtx); 
} 
有关如何创建自定义同步上下文的详细信息:



尽管定制线程池很少是必需的。您可能应该在使用内置线程池的同时尝试进行优化。

我认为您不需要自定义线程池,特别是如果您正在执行大量并行I/O,而这些I/O自然使用IOCP线程。这适用于仅在其任务完成时从池中获取线程的任何其他API(例如,
task.Delay

通常您会执行
wait任务。配置wait(false)
以便继续在
任务完成的同一线程上执行:

// non-IOCP (worker) continuation thread 
await Task.Delay(1000).ConfigureAwait(false); 
// IOCP continuation thread
await stream.ReadAsync(buff, 0, buff.Length).ConfigureAwait(false); 
现在,在ASP.NET中,您甚至不需要使用
ConfigureAwait
。与UI应用程序的WinFormsSynchronizationContext
或DispatchersSynchronizationContext
不同,ASP.NET的
AspNetSynchronizationContext
不维护
Wait
延续的线程关联性。您的continuations将在任务已完成的任何线程上运行
AspNetSynchronizationContext
只需“输入”该线程上的ASP.NET上下文,以确保您的代码可以访问
HttpContext
和其他相关ASP.NET请求环境状态信息

您可以使用
ThreadPool.SetMinThreads
来增加IOCP和工作线程的默认数量

如果定制线程池的唯一原因是限制任务的并行级别,请使用TPL数据流或简单地
SemaphoreSlim.WaitAsync
(选中)


也就是说,如果您实现了一个定制的等待器,那么您可以非常精确地控制
任务
继续。查看一个基本的例子。

与其重新发明weel,不如提高线程池的限制?这听起来不对。您正在达到线程池限制?那么您可能有太多的并发阻塞工作。;考虑一下,只需增加线程池限制。增加线程池限制并不能解决我的问题。我正在使用完成端口执行大量IO,因此阻塞不在线程级别。但是,由于该项目正在进行大量并行工作(6000个或更多并行任务),我希望将它们与框架线程池完全分开运行。当web服务器需要处理的客户端数量超过其可能处理的数量时,您预计会发生什么情况?发生了。@Hans我们说的是一个客户。问题是,系统用于处理请求的所有线程都忙于等待我的长时间运行任务。我想把它转移到我自己的线程中。@l3arnon谢谢,我会调查的。@MartinWalter,我警告你不要在ASP.NET中安装自定义同步上下文,即使是在single
Wait
的范围内。您不仅会丢失
HttpContext.Current
和其他环境HTTP请求属性,还可能会混淆一些依赖
AspNetSynchronizationContext
@Noseratio的ASP.NET运行时API。谢谢您的建议,但我没有这些问题:我的工作完全独立于HttpContext(它甚至不知道它正在ASP项目中运行),我只为自己的线程更改同步上下文。