多线程刚刚学,还望不要拍砖..
问题描述:在一个方法内调用类中的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(在不是他类中方法的内部调用就没问题呢...),求解惑
问题描述:在一个方法内调用类中的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(在不是他类中方法的内部调用就没问题呢...),求解惑
这里是我所说的 红色代码部分,没上色,直接输出源码了
不要在窗体线程中调用它,应该在你的工作线程中调用。