Mr.*_*Boy 4 c# task-parallel-library
如何将 LongRunning 标志专门传递给 Task.Run()?强调将任务创建标志放入较新的 API 中可能会有点混乱,尤其是使用该async模式。
我发现这篇文章声称这不是一个好主意async,不应该使用:http ://blog.i3arnon.com/2015/07/02/task-run-long-running/
我的理解是,这个标志实际上会导致 TPL 启动专用线程而不是给线程池带来压力,但特别是如果我的应用程序不涉及大量并行任务,这真的有什么大不了的吗?如果我预期的并行度小于默认线程池大小(无论是什么),我可以安全地忽略该标志吗?最糟糕的情况是线程池可能会在几百毫秒内缺乏线程?
LongRunning当调用Task.Factory.StartNew方法而不传递参数时,默认情况下会省略该标志TaskCreationOptions,因此您可以放心地认为省略它是安全的。实际上,省略它比包含它更安全,因为该标志旨在作为性能优化技术,而不是作为日常用品。
一般来说,除非您发现确实需要它,否则不要使用它。通常,只有
LongRunning当您通过性能测试发现不使用它会导致其他工作处理过程中出现长时间延迟时,您才会使用它。(引文)
如果由于ThreadPool其线程被误用(在等待 I/O 操作完成时被阻塞)而导致 s 通常处于饥饿状态,那么与其用Task该标志装饰所有 s LongRunning,更简单、更有效的解决方法可能是增加最小线程数应用程序初始化期间ThreadPool使用该方法的线程数。ThreadPool.SetMinThreads例如:
ThreadPool.SetMinThreads(workerThreads: 100, completionPortThreads: 5);
Run Code Online (Sandbox Code Playgroud)
当您重构应用程序以正确使用异步时,将更容易撤消此黑客攻击,而不是LongRunning在代码中的任何地方撤消该标志。
| 归档时间: |
|
| 查看次数: |
1865 次 |
| 最近记录: |