ThreadPool.QueueUserWorkItem 和 Task.Factory.StartNew 之间的性能差异

Tha*_*dis 5 c# .net-4.0 threadpool task-parallel-library taskscheduler

我有一个ThreadPool.QueueUserWorkItem在几个地方使用的代码库。我认为这将是使用一个好主意,切换ThreadPool.QueueUserWorkItem到使用Task.Factory.StartNewTaskScheduler.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在质量检查行动的标志,使得质量检查的等待,即使该标志不会在设置记录操作开始?