Я немного сбит с толку из-за ManualResetEvent, которое я использую, которое, кажется, не разблокирует. Кто-нибудь знает, почему это может иметь место?
У меня есть сценарий такого рода. Реальная ситуация довольно сложна, и мне не удалось выделить фрагмент кода, который разумно опубликовать, чтобы воспроизвести проблему.
EDIT
Я обновил пример кода ниже. Это выполняется в ряде различных диалогов, и я заметил, что один из них попадает в this.mre.WaitOne (); Затем происходит диалоговое окно «Server Busy», где мне нужно нажать «switch to» или «retry», что позволит моему коду перейти на шаг 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.
}
}