C# TAP和async/await是否用于专用线程?
我有一些线程专用于一个任务(接收和处理请求),还有一些线程专用于其他任务(长时间运行/CPU密集型任务)。 这是一个控制台应用程序C# TAP和async/await是否用于专用线程?,c#,multithreading,concurrency,async-await,task,C#,Multithreading,Concurrency,Async Await,Task,我有一些线程专用于一个任务(接收和处理请求),还有一些线程专用于其他任务(长时间运行/CPU密集型任务)。 这是一个控制台应用程序 我想在所有线程中使用async/await,但我了解到async/await使用继续运行,这意味着请求处理可能会延迟,因为出现了大量CPU密集型任务(是的,这么多,这就是为什么我限制了执行此任务的线程数) 如果我想限制并发,那么我不能使用TAP 如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP 我应该用自己的SyncronizationContext
我想在所有线程中使用async/await,但我了解到async/await使用继续运行,这意味着请求处理可能会延迟,因为出现了大量CPU密集型任务(是的,这么多,这就是为什么我限制了执行此任务的线程数)
我想在所有线程中使用async/await,但我了解到async/await使用托管线程池来运行continuation,这意味着请求处理可能会因为出现大量CPU密集型任务而延迟(是的,这么多,这就是为什么我做这项工作的线程数有限) 这是一个足够严密的分析。从技术上讲,不是
async
/await
需要线程池来继续,而是内部TAP方法实现。也就是说,这是BCL中的常见模式,因此,耗尽线程池可能会导致异步完成的延迟
如果我想限制并发,那么我不能使用TAP
只要您没有淹没线程池,就可以使用TAP。限制并发将释放线程池,从而启用TAP
如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP
我认为这更像是“不要把线程池淹没在工作中”。耗尽的线程池对于任何类型的工作都不是很好
我应该用自己的SyncronizationContext编写一个ThradPool实现吗?
有没有其他方法可以在某些线程集中运行continuation
您可以使用SynchronizationContext
控制执行wait
恢复的位置,但仍有BCL内部完成需要排队到线程池。这是无法控制的;唯一的实际选择是保持线程池空闲
我想在所有线程中使用async/await,但我了解到async/await使用托管线程池来运行continuation,这意味着请求处理可能会因为出现大量CPU密集型任务而延迟(是的,这么多,这就是为什么我做这项工作的线程数有限) 这是一个足够严密的分析。从技术上讲,不是
async
/await
需要线程池来继续,而是内部TAP方法实现。也就是说,这是BCL中的常见模式,因此,耗尽线程池可能会导致异步完成的延迟
如果我想限制并发,那么我不能使用TAP
只要您没有淹没线程池,就可以使用TAP。限制并发将释放线程池,从而启用TAP
如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP
我认为这更像是“不要把线程池淹没在工作中”。耗尽的线程池对于任何类型的工作都不是很好
我应该用自己的SyncronizationContext编写一个ThradPool实现吗?
有没有其他方法可以在某些线程集中运行continuation
您可以使用
SynchronizationContext
控制执行wait
恢复的位置,但仍有BCL内部完成需要排队到线程池。这是无法控制的;唯一的实际选择是保持线程池空闲。使用该方法增加ThreadPool
生成的线程的初始数量如何?例如ThreadPool.SetMinThreads(100,10)
@TheodorZoulias我不喜欢这个解决方案,因为请求处理和长时间运行的任务仍然混合在一个线程池中,这仍然会导致没有线程处理请求的情况,因为所有线程都忙于长时间运行的任务。对于长时间运行的任务,我真的不需要那么多线程(3个线程就足够了)。使用该选项启动长时间运行的任务怎么样?顺便说一句,你说的“长时间运行”是指从应用程序的开始到结束,还是仅仅持续几秒钟以上?@TheodorZoulias我不知道TaskCreationOptions。长时间运行,谢谢!一个作业可以持续数小时也可以持续数分钟,但它们会一直持续到应用程序停止为止。longlunning
选项实际上没有什么特别之处。它只是在一个新线程而不是ThreadPool
线程中运行任务。我的猜测是,长时间运行的任务实际上是由于Thread.Sleep
而延迟的循环。如果是这种情况,那么您可以将线程.Sleep
替换为等待任务.Delay
,并且具有不需要专用线程的长时间运行的任务。是一个例子。使用该方法增加ThreadPool
生成的线程的初始数量如何?例如ThreadPool.SetMinThreads(100,10)
@TheodorZoulias我不喜欢这个解决方案,因为请求处理和长时间运行的任务仍然混合在一个线程池中,这仍然会导致没有线程处理请求的情况,因为所有线程都忙于长时间运行的任务。对于长时间运行的任务,我真的不需要那么多线程(3个线程就足够了)。使用该选项启动长时间运行的任务怎么样?顺便说一句,你说的“长时间运行”是指从应用程序的开始到结束,还是仅仅持续几秒钟以上?@TheodorZoulias我不知道TaskC