C# 3.5 Winforms アプリ。
別のスレッドで30秒ごとに起動するタイマーがあります(VS出力ウィンドウにテキスト文字列を書き込むだけです)。
また、特定のプロセスが起動した場合にそのプロセスが終了するのを待つ別のスレッドもあります。たとえば、winword.exe です。
そのスレッドには、次のコードがあります。
p.WaitForExit();
そして、そこに座って、winword.exe
終了するのを待ちます。それはうまくいきます。
ただし、終了するのを待っている間、winword.exe
(出力ウィンドウにテキストを送信する) 完全に別のスレッドの 30 秒タイマーは実行されません。
3分待ってから(この時点で他のタイマーは6回実行する必要がありますが、WaitForExit()
待機中は実行しません)、終了しwinword.exe
ます。突然、他のタイマーが一度に 6 回実行し始めます。タイマー イベントのバックログがあり、突然 .Net がすべてを同時に実行しようとするようなものです。
p.WaitForExit()
アプリの別のスレッド (メイン UI スレッドではない) からアプリケーションを実行しているのに、アプリケーション全体をブロックしているように見えるのはなぜですか?
編集:はい、別のスレッドにあります。これを起動するために使用するコードは次のとおりです。
try
{
Thread t = new Thread(ProcessCheck); // Kick off a new thread
t.Start();
ConfigLogger.Instance.LogInfo("++ ProcessCheck thread started @ " + DateTime.Now);
}
catch (Exception ipwse)
{
ConfigLogger.Instance.LogInfo(ipwse.Message + " " + ipwse.StackTrace);
}
私が持っている ProcessCheck() メソッドは次のとおりです。
foreach (Process p in System.Diagnostics.Process.GetProcessesByName("winword"))
{
this.Invoke(new MethodInvoker(delegate()
{
try
{
p.WaitForExit();
}
catch (Exception)
{
}
}));
}