有两条线程,工作线程实时获得出ID的值,主线程根据工作线程ID的值设置控件Lable.Text;
代码如下:
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
test.SetLable += SetLable;
Thread t = new Thread(new ThreadStart(test.ThreadRun));
t.Start();
}
private void SetLable()
{
if(this.label1.InvokeRequired)
this.Invoke(new SetLableEventHandler(SetLable));
else this.label1.Text=test.BackID().ToString();
}
}delegate void SetLableEventHandler();
static class test
{
static int ID = 0;
static object LockObject = new object();
public static event SetLableEventHandler SetLable;
public static void ThreadRun()
{
lock (LockObject)
{
do
{
ID++;
if (SetLable != null) SetLable();
//Thread.Sleep(100);
} while (ID < 100000);
}
}
public static int BackID()
{
lock (LockObject)
{
return ID;
}
}
}以上静态类test的BackID和ThreadRun两个方法都用了lock锁定..这样马上就会出现死锁,如果不锁定
程序运行没有问题,但是理论上并不安全..因为程序原先的设计是基于组件(插件)方式的,主程序(主线程)并不知道插件内部实现,test是插件...所以改只能改test,,请问有什么好的方法..以上我认为是出现了交叉锁定引起死锁的...即this.Invoke里面也存在一个锁..
代码如下:
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
test.SetLable += SetLable;
Thread t = new Thread(new ThreadStart(test.ThreadRun));
t.Start();
}
private void SetLable()
{
if(this.label1.InvokeRequired)
this.Invoke(new SetLableEventHandler(SetLable));
else this.label1.Text=test.BackID().ToString();
}
}delegate void SetLableEventHandler();
static class test
{
static int ID = 0;
static object LockObject = new object();
public static event SetLableEventHandler SetLable;
public static void ThreadRun()
{
lock (LockObject)
{
do
{
ID++;
if (SetLable != null) SetLable();
//Thread.Sleep(100);
} while (ID < 100000);
}
}
public static int BackID()
{
lock (LockObject)
{
return ID;
}
}
}以上静态类test的BackID和ThreadRun两个方法都用了lock锁定..这样马上就会出现死锁,如果不锁定
程序运行没有问题,但是理论上并不安全..因为程序原先的设计是基于组件(插件)方式的,主程序(主线程)并不知道插件内部实现,test是插件...所以改只能改test,,请问有什么好的方法..以上我认为是出现了交叉锁定引起死锁的...即this.Invoke里面也存在一个锁..
解决方案 »
- DataGridView不能设置固定列宽值吗?
- 怪问题,请教SqlBulkCopy超时的问题
- 连接EXCEL "外部表不是预期的格式。"错误
- C#里的SqlDataAdapter执行create table等语句,为什么结果跟踪不到
- winform datagridview自定义列如何实现
- 刷新问题
- c#中如何求得数组元素个数
- 调用MATLAB打包的COM出错
- 谁用过c1TrueDBGrid 阿?帮忙来看一下
- 如何修改oracle的日期字段
- 03web环境下,添加System.Data.OracleClient之后,出现安全性错误!
- 当一个object类型的值为NULL时,怎样将他强制转换为INT型
public static void ThreadRun()
{
do
{
lock (LockObject)
{
ID++;
}
if (SetLable != null) SetLable();
//Thread.Sleep(100);
} while (ID < 100000);
}
if(this.label1.InvokeRequired)
this.Invoke(new SetLableEventHandler(SetLable)); //把BackID的值作为参数传过去
{
do
{
ID++;
if (SetLable != null) SetLable();
//Thread.Sleep(100);
}while (ID < 100000);
}
你在已经锁的情况下又调用setlabel-> BackID()-> lock (LockObject)在这里死锁了。因为锁还未被释放。