线程死锁

fanbingyuan 2011-02-21 04:51:26
现在遇见个这么个问题。
子线程lock了一个资源。lock资源的这段时间调用委托,使用invoke()方法在主线程执行相关操作,主线程又需要使用子线程当前lock的资源,请问这个该怎么解决啊。
因为源代码太长,简单写下一个demo

public class a
{
public string b = "aaaaa";
public event EventHandler dosomestring;
public void test()
{
lock (b)
{
if (dosomestring != null)
{
dosomestring(b, new EventArgs());
}
}
}
}



private void btn_Click(object sender, EventArgs e)
{

a aa = new a();
aa.dosomestring += new EventHandler(aa_dosomestring);
Thread tr = new Thread(aa.test);
tr.Start();
}

void aa_dosomestring(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(...);
}
else
{
this.tbx.Text=(string)sender;
}

}
...全文
122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wantalcs 2011-02-22
  • 打赏
  • 举报
回复
1、把主线程lock资源所做的工作也交给子线程,让子线程lock资源后就无顾虑的做完所有该资源相关工作。
2、子线程不要先lock主窗体资源再做复杂计算,先计算好结果,到了仅仅需要主窗体那一刻再Invoke主窗体,且速Inoke速决。
fanbingyuan 2011-02-22
  • 打赏
  • 举报
回复
对了,我其实就是想知道,有没有一种方式就是子线程传递某个参数给主线程,相当于信号,让主线程执行某段特定代码,与此同时子线程继续执行他自己相应的代码、
fanbingyuan 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yizhili 的回复:]

子线程 lock 了什么?怎么使用它?用来做什么?
主线程需要什么?准备怎么使用它?用来做什么?
主线程里的参数能不能移动出来?

详细说明一下,最好再给些代码
[/Quote]
昨天晚上仔细的想了想,在主线程中调用被锁的资源的唯一方法就是在子线程中解锁。但是解锁费老鼻子劲了,当初一锁就锁了很长时间,在锁着的时候就执行了很多很多操作。这是一大忌,吸取教训,以后得注意。还有另一种方案就是在子线程中完成主线程的工作,恩,也可以说是错上加错,因为这个资源还得继续锁着。但是相对简单点,就是采取各种方法。将需要的参数传递到子线程中。用个类和一个委托就可以实现。下下策了。我去试试。
fanbingyuan 2011-02-22
  • 打赏
  • 举报
回复
ok,解决,结贴,就是在子线程中处理
yizhili 2011-02-21
  • 打赏
  • 举报
回复
子线程 lock 了什么?怎么使用它?用来做什么?
主线程需要什么?准备怎么使用它?用来做什么?
主线程里的参数能不能移动出来?

详细说明一下,最好再给些代码
fanbingyuan 2011-02-21
  • 打赏
  • 举报
回复
我一天了,也一直在想其他的解决方法。
这个在主线程需要用的当前子线程lock的资源,比如socket列表,轮询发给客户端信息。子线程中操作那个socket列表还不好操作。需要用到主线程中的一些参数,哎,就是当初没设计好,现在麻烦了。
yuan0716 2011-02-21
  • 打赏
  • 举报
回复
把那资源再拷贝一份就是了
yizhili 2011-02-21
  • 打赏
  • 举报
回复
你具体要做什么?有没有绕开的方法?
感觉比较复杂

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧