线程池实现中的问题(C#3.0)

时间:2010-06-09 05:25:02

标签: c#-3.0

我已完成以下线程池程序,但问题是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   感谢

2 个答案:

答案 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);
}