Use asynchronous delegates or ThreadPool.QueueUserWorkItem for mass parallelism?

I have a .NET application that processes about 300,000 records in a batch import, and it takes a few seconds to write, so I would like to parallelize this. In the following code, what's the difference between ProcessWithAnsycDelegates() and 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; } } 
+6
multithreading asynchronous threadpool
source share
2 answers

In this case, not so much, because they both use threadpool under the hood. I would say that QueueUserWorkItem () is easier to read and see what happens against BeginInvoke.

This link may help. This is older information, but still mostly applicable http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml

+6
source share

The literal answer to the question is that both use threadpool, so the difference is not much if performance is the only consideration.

If the question is really about getting maximum performance, then this can help to find out that using threadpool really has problems. These include:

  • Work queue lock conflict
  • Excessive context switching. If you have 2 processors and a work item sequence, then 25 threads really don't help. It is better to have 2 threads, one for each processor.

It might be worth exploring TPL and PLINQ:

One example they give for using TPL:

 for (int i = 0; i < 100; i++) { a[i] = a[i]*a[i]; } 

in

 Parallel.For(0, 100, delegate(int i) { a[i] = a[i]*a[i]; }); 
+7
source share

All Articles