0

スレッド/バックグラウンド プロセスに頭を悩ませているのが最悪です。私の問題は、ある程度まではよくあることのように思えますが、私のニーズを満たす良い例をまだ見つけていません。

古典的な例は次のようになります:
特定の長時間実行されるタスク/プロセスが実行されると、UI がフリーズします - 少なくとも UI を移動/最小化できるようにしたいです。

従来の応答には、スレッド化とタスク ファクトリ、および BackgroundWorker ソリューションが含まれます。しかし、どのように実装しても、結果は良くありません。

私のプログラムでは、別のアプリケーションを実行していて、それが終了するのを待っています。簡単にするために、私は次のようにやっているとしましょう:

            Process p = Process.Start("notepad.exe somefile.txt");
            p.WaitForExit();
            //read somefile.txt

WaitForExit()メモ帳を閉じるのを待っている間にアプリケーション UI がハングアップすることは明らかでした。

私はこれについて多くの提案された手段を試みましたが、2 つのコーナーのいずれかにペイントされます。

  1. インターフェイスがまだハングし、メモ帳を閉じると somefile.txt が正常に読み取られます。
  2. プロセス (メモ帳) は正常に実行されますが、メモ帳を閉じる直前にアプリケーションが somefile.txt を読み取ります (したがって、非同期で実行されていると思います)。

私が見るほとんどの例は、大きな数まで数えることを含んでいます。単純ですが、私がやっていることとはまったく異なります。この「外部」プロセスを起動すると、少し複雑になります。

お時間をいただきありがとうございます。

4

2 に答える 2

0

アプリケーションが別のスレッドで呼び出しを実行していないという音から、Process.WaitForExitそれ以外の場合はハングすることはありません。

BackgroundWorkerThreadおよびThreadPoolはすべて便利なツールですが、操作が難しく扱いにくい場合があります。Task Parallel Library は、System.Threading.Task非同期で実行する必要があるほとんどの操作でスレッドを直接使用することで多少「取って代わられました」。

参照: C# のスレッドと新しいタスク ライブラリ

したがって、コードは次のようになります。

Task.Factory.StartNew(() =>
{
   var proc = new Process("...");
   proc.WaitForExit();
   File.Read("...");
});
于 2013-04-06T18:50:08.897 に答える