C#使用ThreadPool执行方法(带参数)
我们有以下一段代码(此代码的想法在本网站上找到),它将为“Do_SomeWork()”方法生成新线程。这使我们能够异步多次运行该方法 代码是:C#使用ThreadPool执行方法(带参数),c#,multithreading,parameters,threadpool,C#,Multithreading,Parameters,Threadpool,我们有以下一段代码(此代码的想法在本网站上找到),它将为“Do_SomeWork()”方法生成新线程。这使我们能够异步多次运行该方法 代码是: var numThreads = 20; var toProcess = numThreads; var resetEvent = new ManualResetEvent(false); for (var i = 0; i < numThreads; i++) { new Thread(
var numThreads = 20;
var toProcess = numThreads;
var resetEvent = new ManualResetEvent(false);
for (var i = 0; i < numThreads; i++)
{
new Thread(delegate()
{
Do_SomeWork(Parameter1, Parameter2, Parameter3);
if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
}).Start();
}
resetEvent.WaitOne();
var numThreads=20;
var toProcess=numThreads;
var resetEvent=新的手动重置事件(false);
对于(var i=0;i
但是,我们希望使用ThreadPool,而不是创建我们自己的新线程,这可能会损害性能。问题是,我们如何修改上述代码以利用ThreadPool,记住方法“Do_SomeWork”包含多个参数,并且还有一个返回类型(即方法不是void)
还有,这是C#2.0。有了C#2.0,你可以打电话
ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc });
然后在回调中,将对象[]转换回正确的参数和类型。关于返回类型,如果使用ThreadPool,我认为您无法获得返回值,则回调必须具有
void回调(对象参数)
大致相同,但使用传递给ThreadPool.QueueUserWorkItem的WaitCallback:
var numThreads = 20;
var toProcess = numThreads;
var resetEvent = new ManualResetEvent(false);
for (var i = 0; i < numThreads; i++)
{
ThreadPool.QueueUserWorkItem (
new WaitCallback(delegate(object state) {
Do_SomeWork(Parameter1, Parameter2, Parameter3);
if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
}), null);
}
resetEvent.WaitOne();
var numThreads=20;
var toProcess=numThreads;
var resetEvent=新的手动重置事件(false);
对于(var i=0;i
想想在传递null对象/tasksInfo的同时在回调上运行方法是否真的很酷