ThreadPool.QueueUserWorkItem与Task.Factory.StartNew

时间:2016-04-25 13:28:17

标签: c# .net-4.0 task-parallel-library threadpool taskscheduler

我在几个地方使用ThreadPool.QueueUserWorkItem代码库。我认为最好从使用ThreadPool.QueueUserWorkItem切换到使用Task.Factory.StartNew并使用TaskScheduler.Default作为调度程序。

升级后,我看到应用程序的执行时间很高。它作为在线跨国应用程序,接收请求并且通常在 40ms 500ms 之间响应,这是可以接受的。切换到任务方式后,我看到许多事务从4000毫秒到38000毫秒进行响应,这是不可接受的。

流程非常复杂。它涉及传入事务的同步循环,它实际上执行简单的验证并插入到数据库中。之后,会触发一些并行操作,主循环继续到下一个传入事务。并行操作主要是日志记录,以及对数据进行数据库密集型质量检查。

所有日志记录操作都是在ThreadPool中用

启动的
ThreadPool.QueueUserWorkItem(/*logging action*/)

质量检查操作已启动

Task.Factory.StartNew(/*qc action*/,
     TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness)

应用更改后 记录操作已切换到

Task.Factory.StartNew(/*logging action*/,
     CancellationToken.None,
     TaskCreationOptions.None,
     TaskScheduler.Default)

质量检查操作已切换为

Task.Factory.StartNew(/*qc action*/,
     CancellationToken.None,
     TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness,
     TaskScheduler.Default)

当在ThreadPoolScheduler(TaskScheduler.Default)上使用Task.Factory.StartNew执行时,日志操作是否有可能停止质量检查操作,但是当直接在带有QueueUserWorkItem的ThreadPool上执行时,它们不会?< / p>

质量检查操作中的TaskCreationOptions.PreferFairness标志是否有可能进行质量检查,即使在他们的启动中没有设置此标志时也会等待记录操作?

0 个答案:

没有答案