C#创建多个任务,每个任务的执行速度比不并行执行的任务慢

时间:2019-09-24 14:30:37

标签: c# multithreading parallel-processing execution-time thread-synchronization

我有这部分代码

bool hasData = true;
using (Context context = new Context())
{
    using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(MAX_THREADS))
    {
        while (hasData)
        {
            Message message = context.Database.SqlQuery<Message>($@"
select top(1) * from Message  where 
( Status = {(int)MessageStatusEnum.Pending} ) or 
( Status = {(int)MessageStatusEnum.Paused } and ResumeOn < GETUTCDATE() )
            ").FirstOrDefault();

            if message == null)
            {
                hasData = false;
            }
            else
            {

                concurrencySemaphore.Wait();

                tasks.Add(Task.Factory.StartNew(() =>
                {
                    Process(message);

                    concurrencySemaphore.Release();

                }, this.CancellationToken));

            }
        }
        Task.WaitAll(tasks.ToArray());
    }
}

我的Process函数就是这样

private void Process(Message message)
{
    System.Threading.Thread.Sleep(10000);
}

现在,如果我只有1个要处理的项目,则总执行时间为10秒,每个项目(1个项目)的执行时间为10秒。 好吧,如果我有10个项目,那么每个项目的执行时间将增加到15-20秒。

我试图更改MAX_THREADS的值,但是总是如果我队列中有10个以上的项目并开始并行执行,则每个项目的执行时间约为15秒。

我想念什么?

1 个答案:

答案 0 :(得分:0)

这并不意外。 Parallel Slowdown是一个非常现实的问题。一方面,我们有pleasingly parallel个操作。另一方面,本质上是串行的东西,例如计算斐波那契数列。并且它们之间有很多区域。

一般来说,多任务处理尤其是多线程处理并不是万灵药,它可以使一切变得更快。我想说:多任务处理必须仔细选择问题。如果您针对非预期的问题投入了更多任务,那么最终得到的代码将是:

  • 更复杂
  • 更多内存需求
  • 最重要的是要慢,然后是简单的顺序操作

充其量您只是将所有任务管理开销添加到了操作中。最糟糕的是,您会陷入僵局和资源竞争。而且您的“休眠线程”示例操作无论如何都不会从多任务中受益。请告诉我们您要通过多任务/线程加速的实际操作。因此,我们可以告诉您是否有可能解决。

相关问题