gpt4 book ai didi

.net - 使用异步委托(delegate)或 ThreadPool.QueueUserWorkItem 进行大规模并行?

转载 作者:行者123 更新时间:2023-12-03 17:49:07 24 4
gpt4 key购买 nike

我有一个 .NET 应用程序,它在批量导入中处理大约 300,000 条记录,每条记录需要几秒钟,所以我想并行化它。在下面的代码中,ProcessWithAnsycDelegates() 之间有什么区别?和 ProcessWithThreadPool() ?

public class ResultNotification
{ public EventHandler event Success;
public EventHandler event Fail;
internal void Notify(bool sucess) {if (success) Success(); else Fail();}
}

public static class Processor
{ public ResultNotification ProcessWithAnsycDelegates(Record record)
{ var r = new ResultNotification();
Func<Record,bool> processRecord=new RecordProcessor().ProcessRecord;
processRecord.BeginInvoke
( record
,ar => result.Notify(processRecord.EndInvoke(ar))
,null);
return r;
}

public ResultNotification ProcessWithThreadPool(Record r)
{ var r = new ResultNotification();
var rp = new RecordProcessor();
ThreadPool.QueueWorkUserItem(_=>result.Notify(rp.ProcessRecord(r)));
return r;
}
}

最佳答案

这个问题的字面答案是两者都使用线程池,所以如果性能是唯一的考虑因素,那么差异并不大。

如果问题真的是关于获得最佳性能,那么知道使用线程池确实存在问题可能会有所帮助。这些包括:

  • 工作队列上的锁争用
  • 过多的上下文切换。如果您有 2 个 CPU 和一系列工作项,那么 25 个线程并没有真正的帮助。最好有 2 个线程,每个 CPU 一个

  • 可能值得研究 TPL 和 PLINQ:
  • Parallel LINQ Running Queries On Multi-Core Processors
  • Parallel Performance Optimize Managed Code For Multi-Core Machines
  • Improved Support For Parallelism In The Next Version Of Visual Studio

  • 他们给出的使用 TPL 的一个例子是:
    for (int i = 0; i < 100; i++) { 
    a[i] = a[i]*a[i];
    }

    到:
    Parallel.For(0, 100, delegate(int i) { 
    a[i] = a[i]*a[i];
    });

    关于.net - 使用异步委托(delegate)或 ThreadPool.QueueUserWorkItem 进行大规模并行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/192539/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com