我有这部分代码
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秒。
我想念什么?
答案 0 :(得分:0)
这并不意外。 Parallel Slowdown是一个非常现实的问题。一方面,我们有pleasingly parallel个操作。另一方面,本质上是串行的东西,例如计算斐波那契数列。并且它们之间有很多区域。
一般来说,多任务处理尤其是多线程处理并不是万灵药,它可以使一切变得更快。我想说:多任务处理必须仔细选择问题。如果您针对非预期的问题投入了更多任务,那么最终得到的代码将是:
充其量您只是将所有任务管理开销添加到了操作中。最糟糕的是,您会陷入僵局和资源竞争。而且您的“休眠线程”示例操作无论如何都不会从多任务中受益。请告诉我们您要通过多任务/线程加速的实际操作。因此,我们可以告诉您是否有可能解决。