2

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)
        {

        }
    }));
}
4

2 に答える 2

5

this.Invoke、WinForms フォームから実行された場合、プロセスが終了するまで UI スレッドをブロックします。Timer が System.Windows.Forms.Timer の場合、UI スレッドで Tick イベントが発生します。UI スレッドがブロックされている場合、Tick イベントが発生しない理由が説明されます。

于 2012-07-30T16:51:16.973 に答える
0

次のプログラムは、スレッドを正しく実行している限り、実行していることが機能することを示しているため、わかりません。

static void Main(string[] args)
{
    BackgroundWorker shortThread = new BackgroundWorker(), waitThread = new BackgroundWorker();

    shortThread.WorkerSupportsCancellation = true;
    shortThread.DoWork += (s, e) =>
        {
            while (true)
            {
                if (shortThread.CancellationPending)
                {
                    break;
                }

                Console.WriteLine("Hello World...");
                Thread.Sleep(2000);
            }
        };

    waitThread.WorkerSupportsCancellation = true;
    waitThread.DoWork += (s, e) => { Process.Start("winword.exe").WaitForExit(); };

    shortThread.RunWorkerAsync();
    waitThread.RunWorkerAsync();

    Console.ReadLine();

    shortThread.CancelAsync();
    waitThread.CancelAsync();
}

WaitForExit()したがって、別のスレッドではなくメインスレッドで発行しているように見えます。

于 2012-07-30T16:45:45.517 に答える