2

スレッドを使用して、重みを読み取るためのwhileループを含む関数を呼び出しています。whileループでは、デリゲート関数を呼び出してテキストボックスの値を更新しています。

、という名前のボタンをクリックするとStop、スレッドを中止しようとしていますが、スレッド中止の例外が発生します。

 private System.Threading.Thread comm1;
 comm1 = new System.Threading.Thread(new System.Threading.ThreadStart(reading));
 comm1.Start();

 public void reading()
 {
   while(continus)
   {
     textBox1.Invoke(
                     new PrintValueTextDelegate(PrintValueText), 
                     new object[] { text Box, value.ToString() });

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

     if (_protocollo.Manda_TLC1(2, 0x70, risposta) == true)
     {
        if ((risposta[0] & 0x80) != 0x80)
        {
           cella = risposta[1] * 256 + risposta[2];
           string rt = cella.ToString();
        }
      }
   }
 }

 private void btnstop_Click(object sender, EventArgs e)
 {
   try
   {
      continus = false;             
      System.Threading.Thread.Sleep(1000);               
      comm1.abort(); // wait for close foreground thread 
   }
   catch (Exception rt)
   {
       MessageBox.Show(rt.ToString());
   }          
 }

上記のコードでは、スレッドアボート例外が発生しています。この問題を解決するために誰か助けてください。

4

4 に答える 4

2

スレッドに中止するように指示しているため、スレッド中止例外が発生しています...

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx (現時点では動作していませんが、Google のキャッシュからテキストを取得しました) は次のように述べています。

Abort メソッドが呼び出されたときにスローされる例外。

これは、 Thread.Abort() への呼び出しが失敗したことを示す例外ではなく、中止しようとしているスレッドからの例外であり、「ああ、中止されました!」と言っていることに注意してください。

より適切に停止したい場合は、停止呼び出しcontinusで while ループの変数を false に変更します。その後、while ループの実行が停止し、スレッドが終了するはずです。

于 2011-11-04T11:34:44.343 に答える
2

を呼び出すThread.Abort()と、スレッド アボート例外がスローされます。これが動作方法です。

ドキュメント「呼び出されたスレッドで ThreadAbortException を発生させる」を参照してください。

于 2011-11-04T11:34:59.733 に答える
2

変化する

comm1.abort();// wait for close foreground thread 

comm1.join();// wait for close foreground thread 

abortスレッドをすぐに停止しますjoinが、終了するまで待機します。

于 2011-11-04T12:50:25.420 に答える
2

CancellationTokenSource を使用して、キャンセル操作をスレッドに発行し​​ます。アプリケーションは、キャンセルが要求されているかどうかを確認する必要があることに注意してください。スレッドが終了するのを待つには、thread.Join を使用します。

于 2011-11-04T13:01:25.510 に答える