Tha*_*dis 5 c# .net-4.0 threadpool task-parallel-library taskscheduler
我有一个ThreadPool.QueueUserWorkItem在几个地方使用的代码库。我认为这将是使用一个好主意,切换ThreadPool.QueueUserWorkItem到使用Task.Factory.StartNew与TaskScheduler.Default作为调度。
升级后,我看到应用程序的执行时间非常高。它作为在线跨国应用,接收请求,并且典型地之间响应40毫秒和500毫秒,其是可接受的。切换到 Tasks 方式后,我看到许多事务需要 4000 毫秒甚至 38000 毫秒才能响应,这是不可接受的。
流程相当复杂。它涉及传入事务的同步循环,它实际上执行简单的验证并插入到数据库中。之后,一些并行动作被触发,主循环继续下一个传入的事务。并行操作主要是日志记录和数据的 db 密集质量检查。
所有日志操作都是在 ThreadPool 中启动的
ThreadPool.QueueUserWorkItem(/*logging action*/)
Run Code Online (Sandbox Code Playgroud)
质量检查行动是由
Task.Factory.StartNew(/*qc action*/,
TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness)
Run Code Online (Sandbox Code Playgroud)
应用更改后,日志记录操作已切换到
Task.Factory.StartNew(/*logging action*/,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default)
Run Code Online (Sandbox Code Playgroud)
并且质量检查动作被切换到
Task.Factory.StartNew(/*qc action*/,
CancellationToken.None,
TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness,
TaskScheduler.Default)
Run Code Online (Sandbox Code Playgroud)
当在 ThreadPoolScheduler (TaskScheduler.Default) 上使用 Task.Factory.StartNew 执行时,日志记录操作是否有可能阻止质量检查操作,但是当使用 QueueUserWorkItem 直接在 ThreadPool 上执行时,它们没有?
有没有一种可能性,即TaskCreationOptions.PreferFairness在质量检查行动的标志,使得质量检查的等待,即使该标志不会在设置记录操作的开始?
| 归档时间: |
|
| 查看次数: |
2267 次 |
| 最近记录: |