C# Mutex使用问题:从不同步的代码块中调用了对象同步方法。

yishuihan_2012 2012-12-24 09:49:52
多线程刚刚学,还望不要拍砖..
问题描述:在一个方法内调用类中的mutex实例,报错误...但是直接调用mutex的对象没有问题...


public class MultiThreadDemo
{
public Mutex mu1 = new Mutex(true, "mu1");
public void First(object obj)
{
System.Threading.Thread.Sleep(1000);
DelAppendText del= obj as DelAppendText;
del.Invoke("这是第一个方法");

this.mu1.ReleaseMutex();
}

public void Sencond(object obj)
{
this. mu1.WaitOne();
DelAppendText del = obj as DelAppendText;
del.Invoke("这是第二个方法");
}
}

public partial class FormMain : Form
{
MultiThreadDemo md = new MultiThreadDemo();
}
private void btnStart_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(md.First);
Thread t2 = new Thread(md.Sencond);
t2.Start(new DelAppendText(AppendText));
t1.Start(new DelAppendText(AppendText));
this.AppendText("线程启动完毕..");

}

public void AppendText(string text)
{
if (InvokeRequired)
{
Invoke(new DelAppendText(AppendText), text);
}
else
{
this.txtResult.Text += text + Environment.NewLine;
}
}
private void btnRelase_Click(object sender, EventArgs e)
{
md.mu1.ReleaseMutex();
}


这样运行会报错,错误信息为:从不同步的代码块中调用了对象同步方法。
但是把代码中红色的部分注释掉,在主窗体中 触发btnRelase_Click 事件来使T2方法运行就不会有错

小弟对这个错误消息很不理解,还有为什么这样会报错,而直接调用mutex(在不是他类中方法的内部调用就没问题呢...),求解惑
...全文
1756 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2012-12-25
  • 打赏
  • 举报
回复
只能在获得Mutex的线程释放Mutex
threenewbee 2012-12-24
  • 打赏
  • 举报
回复
md.mu1.ReleaseMutex(); 不要在窗体线程中调用它,应该在你的工作线程中调用。
yishuihan_2012 2012-12-24
  • 打赏
  • 举报
回复
this.mu1.ReleaseMutex(); 这里是我所说的 红色代码部分,没上色,直接输出源码了

111,076

社区成员

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

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

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