-4

こんにちは、any1はこの例外をキャッチしようとするか、それを解決するかを教えてくれます。私が受信ハンドルを閉じると、まだデータが受信された場合、このエラーが発生します。私のオブジェクトDisposed Exceptionを解決する

public partial class Form1 : Form 
{ 
    SerialPort sp; 
    IAsyncResult recv_result; 
    string buffer; 

    private delegate string ReadLine_Delegate(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      sp = new SerialPort("COM8", 9600); 
      sp.Open(); 
      sp.ReadTimeout = 50000; 
      sp.NewLine = "\n\r\0"; 

      ReadLine_Delegate x = new ReadLine_Delegate(sp.ReadLine); 

      recv_result = x.BeginInvoke(new AsyncCallback(ReadLine_Callback), 
             x); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

    private void ReadLine_Callback(IAsyncResult iar) 
    { 
      ReadLine_Delegate y = (ReadLine_Delegate)iar.AsyncState; 
      try 
      { 
       buffer = y.EndInvoke(iar); 
      } 
      catch 
      { 
       MessageBox.Show("Error"); 
       return; 
      } 
      ListBoxAdd(buffer); 
      buffer = ""; 
      recv_result = y.BeginInvoke(new AsyncCallback(ReadLine_Callback), y); 
    } 

    private void disconnectButton_Click(object sender, EventArgs e) 
    { 
     recv_result.AsyncWaitHandle.Close(); 
     sp.Close(); 

    } 
} 
+0

私は数時間前にこの質問を見てきました。 –

+0

例外のスタックを見て、それがどの行かを見てください。 –

+0

可能な複製[Stop Stream.BeginRead()](http://stackoverflow.com/questions/6759938/stop-stream-beginread) –

答えて

1

私は何が起こっているかなり確信しているあなたは(あなたのデリゲートのBeginInvokeを経由して)別のスレッドでブロックReadLine()呼び出しを実行するが、その後、それはReadLine()コールにまだある間、SerialPortClose()を呼び出しているということです。現在閉じられている(したがって廃棄された)ポートにデータが入ると、例外がスローされます。

通常の解決方法は、未処理の読み取りが終了するまでポートを閉じないことです。ある時点で確実に復帰するためには、読み取りにタイムアウトを設定する必要があります。詳細は例hereを参照してください。

0

ロックブロックはおそらくあなたの問題をReadLine_Callbackで解決します。また、IAsyncResult.IsCompletedステータスを確認します。

lock(lockerobject) 
{ 
    // your handler logic. 
} 
関連する問題