Mar*_*ade 6 .net multithreading asynchronous threadpool
我有一个.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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题的字面答案是两者都使用线程池,因此如果性能是唯一的考虑因素,差异并不大.
如果问题实际上是关于获得最佳性能,那么知道使用线程池确实存在问题可能会有所帮助.这些包括:
可能值得调查TPL和PLINQ:
他们给出的TPL使用的一个例子是:
for (int i = 0; i < 100; i++) {
a[i] = a[i]*a[i];
}
Run Code Online (Sandbox Code Playgroud)
至:
Parallel.For(0, 100, delegate(int i) {
a[i] = a[i]*a[i];
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,并不是很多,因为他们都使用引擎盖下的线程池.我会说QueueUserWorkItem()更容易阅读,看看与BeginInvoke有什么关系.
此链接可能有所帮助.这是较旧的信息,但仍然大多适用 http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml
| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |