我已完成以下线程池程序,但问题是WaitCallBackMethod(此处为ThreadPoolCallback)被调用2次(理想情况下应该称为1ce)。我正在制造什么错误?
public class Calculation
{
#region Private variable declaration
ManualResetEvent[] factorManualResetEvent = null;
#endregion
public void Compute()
{
factorManualResetEvent = new ManualResetEvent[2];
for (int i = 0; i < 2; i++){
factorManualResetEvent[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, i);}
//Wait for all the threads to complete
WaitHandle.WaitAll(factorManualResetEvent);
//Proceed with the next task(s)
NEXT_TASK_TO_BE_EXECUTED();
}
#region Private Methods
// Wrapper method for use with thread pool.
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
Method1();
Method2();
factorManualResetEvent[threadIndex].Set();
}
private void Method1 ()
{ //Code of method 1}
private void Method2 ()
{ //Code of method 2 }
#endregion
}
如果我这样做
//Initializang all the manual reset events first
Enumerable.Range(0, exposureManualResetEvent.Length).ToList().ForEach(i =>
{
exposureManualResetEvent[i] = new ManualResetEvent(false);
});
Enumerable.Range(0, 1).ToList().ForEach(i =>
{
ThreadPool.QueueUserWorkItem(ExposureThreadPoolCallback, i);
});
程序挂起了!
我正在使用C#3.0 感谢
答案 0 :(得分:0)
好吧,将ThreadPoolCallback视为您执行的每个线程的ThreadProc(ThreadPool.QueueUserWorkItem()每次调用它时都会启动一个新线程。)。
由于您正在排队2个线程,因此您将获得两次对Proc的调用。
答案 1 :(得分:0)
你打电话两次:
for (int i = 0; i < 2; i++)
{
factorManualResetEvent[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, i);
}