多线程 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”的线程访问它。
还没有解决