Add()和Add1()里面都加上lock(this) ,则两个标签只能轮流显示数字变化,取消其中的一个lock(this)或者两个方法都不要lock(this),则可以同时显示数字变化。不知道其中的原因,lock(this)到底锁定的是什么,msdn上说的是锁定代码块,但是现在是两个方法的代码,怎么也会被锁定呢?请大家指点一二,谢谢Thread myThread;
Thread myThread1;
public void Add()
{
   lock(this)
   {
     for(int i =20 ; i >= 0; i--)
     {
Thread.Sleep(200);
label1.Text = i.ToString();
     }
   }
}
public void Add1()
{
lock(this)
{
for(int j = 0 ; j <=  20; j++)
{
Thread.Sleep(200);
label2.Text = j.ToString();
}
}
}private void Form1_Load(object sender, System.EventArgs e)
{
myThread = new Thread(new ThreadStart(Add));
         myThread1 = new Thread(new ThreadStart(Add1));         myThread.Start();
myThread1.Start();
}

解决方案 »

  1.   

    lock锁的是共享资源.如果您的两个线程中,访问同一个Label,那这个lock的效果就体现出来了.楼主您的两个线程Lock,都是锁住了this,即窗体类,才导致Label不能同时刷新.
      

  2.   

    lock(this)锁定的是lock(this)所在的对象(类实例),也就是说,同一时刻只有一个线程能用这个对象,所以现象就是这个线程用完了,那个线程才能用
      

  3.   

    那当我lock一个,另外一个不lock,为什么没有作用呢?
      

  4.   

    我试着编译了一下你的程序,出现了一个异常:线程间操作无效: 从不是创建控件“label1”的线程访问它。还没有解决
      

  5.   

    什么情况下可以只锁定label,而不会锁定整个窗体?
      

  6.   

    haojie8600
    你是在vs2005中编译我的程序吧,05中对线程间调用有限制的,临时解决方法是在构造函数中:
             Form.CheckForIllegalCrossThreadCalls = false;
    不用检查非法的跨线程调用(权益之计)
      

  7.   

    可以新建两个其他对象: 比如object lockObject1=new object(); object lockObject2=new object();然后锁定这两个对象就不会造成这种资源竞争情况了。