2

私のプロジェクトでは処理速度が非常に重要であるため、最初の機能はデータベースにいくつかの行をロードし、2番目の機能は指定された数のスレッドを使用してそれらの行を処理しています。マルチスレッドを使用しないオプション。

問題は、プロセスの実行を停止するオプションを追加したいということです。つまり、問題が発生した場合に現在のスレッドをすべて停止して、ユーザーが別のスレッド番号を指定して実行を再開できるようにしますが、私の Windows フォームはフリーズして実行しているようです。すべてのスレッドが正常に作業を終了した後、停止メソッドに入ります。

ボタンクリックイベントの処理の詳細については、すべてのスレッドを開始し、その後すべてのスレッドをループしています

for (int i = 0; i < threads.Length; i++)
{
      threads[i].Join();
}

while in ボタン クリック イベント for stop I

for(int i=0;i<threads.Length;i++)
{
     if(threads[i].IsAlive)
     threads[i].Abort();
}

結合部分にコメントを付けると、インターフェイスが応答してイベントのクリックを停止できることに気付きました。

しかし、すべてのスレッドの実行が終了した瞬間を区別したいので、私はそれをしたくありません。

4

2 に答える 2

5

メインスレッドで結合ループを行うと仮定します。つまり、最後のスレッドが終了するまでメッセージ ループが停止し、マルチスレッドが無効になります。また、ボタンクリックを含むすべてのイベントの処理をブロックします。

さておき、 Thread.Abort() を使用しないでください

あなたはより良い計画を考えなければならないでしょう

  • スレッドコードは停止フラグをチェックする必要があります
  • その結合パターンが絶対に必要な場合は、別のスレッドから実行してください。多分バックグラウンドワーカーから。
于 2010-12-30T18:14:05.583 に答える
3

を呼び出すJoinと、メイン スレッドが他のすべてのスレッドを待機するようになり、マルチスレッドが妨げられます。これは、まさに望ましくないことです。呼び出しAbortはスレッドを放棄し、スレッドから結果を取得できなくなります。そうしないでください。

結果を返すコールバックを使用してスレッドを設定し、スレッドをキャンセルする必要があるかどうかをポーリングすることは可能ですが、最も簡単な方法は、BackgroundWorker目的の処理を実行するために特別に設計された .Net クラスを使用することです。Code Projectに優れたチュートリアルがあります。

于 2010-12-30T18:57:43.683 に答える