我对正在使用的ManualResetEvent感到有些困惑,但它似乎并未解除阻塞。有人知道为什么会是这种情况吗?

我所遇到的情况是沿着这些思路进行的。实际情况非常复杂,我还没有设法隔离一段合理的代码以重现该问题。

编辑
我已经更新了下面的代码示例。这是在许多不同的对话框中执行的,我注意到其中一个命中了this.mre.WaitOne();。然后,发生的是我出现“服务器繁忙”对话框,在该对话框中,我需要按“切换到”或“重试”,这将允许我的代码逐步传递通过WaitOne()调用,并且一切正常。我不确定它的相关性,但显然它的重要性。

public class A
{
 ManualResetEvent mre;

 public void Start(ThreadClass tc)
 {
    this.mre = new ManualResetEvent(false);
    tc.Begin();

    WebClient wc = new WebClient();
    // progress events are pumped to the ThreadClass which then update the Form2.
    wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);

    wc.DownloadFileAsync("Src", "Tgt");
    this.mre.WaitOne();
 }

 void void wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
 {
    try
    {
     // Do Stuff
    }
    finally
    {
      this.mre.Set();
    }
 }
}

public class ThreadClass
{
   Begin()
   {
      Thread t = new Thread(new ThreadStart(DoWork));
      t.Start();
   }

   private void DoWork()
   {
     Form f = new Form2();
     f.ShowDialog();

     // Sits waiting on another ResetEvent to determine when to close the thread.
   }
}

最佳答案

Webclient在与调用方相同的线程中运行,因此该线程在WaitOne中被阻止,它实际上并未为您创建新的线程。

将代码移到BackgroundWorker中,或者简单地,不要阻塞,而是等待引发DownloadComplete事件。

10-04 12:52