私が使用しているManualResetEventで少し混乱していますが、ブロックされていないようです。なぜこれが事実かもしれないのは誰でも知っていますか?ManualResetEvent WaitOneがブロック解除されていない
私が持っているシナリオは、これらの行に沿ったものです。実際の状況は非常に複雑で、問題を再現するために投稿するのに合理的なコードの部分を分離することはできませんでした。
編集
以下のコード例を更新しました。これは、いくつかの異なるダイアログで実行され、私はそれらのうちの1つがthis.mre.WaitOne()に当たることに気付きました。それでは、 "Switch to"または "再試行"を押す必要がある「サーバービジー」ダイアログが表示され、コードが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.
}
}
'wc_DownloadFileCompeted'メソッドが呼び出されていますか? –
ジョン、そうです。私はすぐに正常に実行されているSet()になっていますが、私のメインスレッドはまだブロックしています。 例が簡略化されていますが、Set()を別の場所で呼び出すと(たとえば、表示されるダイアログが表示され、キャンセルボタンにもイベントがあります)、このイベントにアタッチされたラムダのSet正常に動作します)。 – Ian
divo、Set()は、WebClientが実際にファイルをダウンロードするために新しいWebClientを作成する必要があると仮定しているので、別のスレッドによって呼び出される可能性が最も高いでしょう。これは、WebClientがSet()を呼び出すイベントを送信するために使用するスレッドです。 – Ian