日期:2014-05-19  浏览次数:20766 次

多线程 lock的作用?
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();
}

------解决方案--------------------
lock锁的是共享资源.如果您的两个线程中,访问同一个Label,那这个lock的效果就体现出来了.

楼主您的两个线程Lock,都是锁住了this,即窗体类,才导致Label不能同时刷新.
------解决方案--------------------
锁定该资源
只能由单个线程访问
------解决方案--------------------
lock(this)锁定的是lock(this)所在的对象(类实例),也就是说,同一时刻只有一个线程能用这个对象,所以现象就是这个线程用完了,那个线程才能用
------解决方案--------------------
我试着编译了一下你的程序,出现了一个异常:线程间操作无效: 从不是创建控件“label1”的线程访问它。

还没有解决