1

私のC#Windowsアプリケーションでは、

エクスポートとキャンセルの 2 つのボタンがあります。

私のエクスポートボタンでは、ここでSQLデータテーブルをスレッドの下で実行されている.csvファイルにエクスポートしています。

thrThreadExportProcess = new Thread(new ThreadStart(startExport));
           thrThreadExportProcess.Start();
           thrThreadExportProcess.IsBackground = true;

エクスポート プロセスの実行中に、ユーザーがここでキャンセル ボタンを押すと、スレッドが中止され、スレッドに参加して、エクスポートされたファイルが削除されます。

スレッドに参加している間、アプリケーションはしばらくハングアップしてから実行されます。

私の質問は、なぜそれがしばらくハングアップするのかです。

これがキャンセルボタンのコードの一部です。

if (thrThreadExportProcess.IsAlive)
            {
               thrThreadExportProcess.Abort();
               thrThreadExportProcess.Join();
               File.Delete(csvPath);
            }

貴重なご意見をお寄せください。

4

2 に答える 2

3

Thread.Abort何についても保証するものではなく、避けるべきです。この特定のケースでハングする理由は、startExportメソッドのコードによって異なります。

msdn の Thread.Abortから:

スレッドがすぐに中止されるか、まったく中止されるかは保証されません。この状況は、アボート プロシージャの一部として呼び出される finally ブロックでスレッドが無制限の量の計算を実行し、それによってアボートが無期限に遅延する場合に発生する可能性があります。スレッドが中止されるまで待機するには、Abort メソッドを呼び出した後にスレッドで Join メソッドを呼び出すことができますが、待機が終了する保証はありません。

スレッドの作成と終了に関するドキュメントは次のとおりです

于 2012-10-03T07:34:07.357 に答える
1

Thread.Abort() は、スレッドがネイティブ コード内にある間 (たとえば、I/O またはネットワークでのブロック)、スレッドをすぐに終了しません。スレッドにできるだけ早く終了するように指示するだけです。

したがって、Thread.Join() は基本的に、中止しているスレッドがディスク/ネットワーク I/O を終了するまで待機します。

Thread.Abort() の使用は、最近ではあまりお勧めできません。可能な限り、.NET 4.5 の新しい async メソッドを使用する必要があります。また、GUI スレッドから Thread.Join() を使用しないでください。

于 2012-10-03T07:34:57.987 に答える