类似以下代码
private object _iTest=0;private void Button1_Click(...)
{
    WaitCallback myCallback = new WaitCallback (tt);     ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
    ThreadPool.QueueUserWorkItem (myCallback); 
}private void tt(object a)
{
    int i=0;
    Mointer.Enter(this._iTest);
    i=(int)_iTest;
    _iTest++;
    moniter.Exit(this._iTest);
    while(true)
    {
        //省略显示i的代码
    }
}显示出来的i永远是某个固定值,要不是最小值,要不是线程数量最大值,但其他情况来看,确实有N个线程在执行,请问在线程池里该如何对全局变量进行同步?另外,上面代码进行改动如下:
把void tt里的    Mointer.Enter(this._iTest);及    moniter.Exit(this._iTest);删除
在Button1_Click里修改如下
    Mointer.Enter(this._iTest);
    ThreadPool.QueueUserWorkItem (myCallback); 
    moniter.Exit(this._iTest);  //这句直接出错

解决方案 »

  1.   

            private object glock = 0;        private int _iTest = 0;        private void tt(object a)
            {
                int i = 0;
                //不要修改显示的值了
                Monitor.Enter(this.glock);
                i = (int)_iTest;
                _iTest++;            this.Invoke(new MethodInvoker(delegate()
                {
                    //显示下
                    textBox1.AppendText(_iTest.ToString() + "\r\n");
                }));            Monitor.Exit(this.glock);            
            }
      

  2.   


        while(true)
        {
            //省略显示i的代码         //记得在这里面释放时间片,你的例子让我死机了一小段时间
             Thread.Sleep(0);
        }
      

  3.   


    Mointer.Enter(this._iTest);
        ThreadPool.QueueUserWorkItem (myCallback); 
        moniter.Exit(this._iTest);  //这句直接出错//这样是不可以的,同一个对象锁定不能嵌套的。
      

  4.   


    private int _iTest = 0;
    //...
    private void tt(object a)
    {
        int i = Interlocked.Increment(ref _iTest);
        while (true)
        {
            //省略显示i的代码
        }
    }
      

  5.   


    谢谢你,Interlocked.Increment只能对int或者long变量进行原子锁递增。可以满足本例
    请问如何在线程池的线程间同步所有变量,而不仅于long或者int变量如果50分不够解决这个问题可以加分。