private void btnStart_Click(object sender, System.EventArgs e)
{
  f(...);//参数略  //这里启动线程,现程通过委托函数调用f.  f(...);//参数略
}public Mutex mWork = new Mutex();
private void f(...)
{
  mWork.WaitOne(); 
  mWork.ReleaseMutex();
}
btnStart_Click中第二次调用f出现问题。waitone()出现死锁,结构上有问题吗?

解决方案 »

  1.   

    to btnStart_Click中第二次调用f出现问题。waitone()出现死锁,结构上有问题吗?线程中是否释放了Mutex。
      

  2.   

    线程是通过回调函数调用主线程中f,f代码如上。线程本身函数没有操作mwork的。
      

  3.   

    我跟踪程序,btnStart_Click如果第二个f抢在线程前调用f就没问题,如在线程调用f之后再调用就死锁。
      

  4.   

    不需要怎么做的吧,
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx
      

  5.   

    多谢各位给思路,定位到问题了。public Mutex mWork = new Mutex();
    private void f(...)
    {
    mWork.WaitOne();
    ListViewItem tempList=new ListViewItem(...);//参数略
    this.listView1.Items.Insert(0,tempList);//listView1是界面上一个ListView,主线程与子线程都在这里输出信息到界面
    mWork.ReleaseMutex();
    }
    是主界面线程出现死锁。一旦子线程抢在主线程第二个f()前调用委托函数,主线程调试运行到mWork.WaitOne()就跑不下。但把this.listView1.Items.Insert(0,tempList)一句注释掉,就可以运行。
    这是什么原因?
      

  6.   

    thread中調用UI控件請使用delegate。
      

  7.   

    public delegate void MyInvoke(ListViewItem tempList);private void InsertViewItem(ListViewItem tempList)
    {
       this.listView1.Items.Insert(0,tempList);
    }private void f(...)
    {
    mWork.WaitOne();
    ListViewItem tempList=new ListViewItem(...);//参数略
             MyInvoke mi=new MyInvoke(InsertViewItem);
             this.BeginInvoke(mi,new object[]{tempList});
    mWork.ReleaseMutex();
    }