2012-04-24 8 views
0

スレッドがシリアルポートをロックし、コマンドを連続して送信し、SerialPort.Write(コマンド)とSerialPort.ReadLine()を使用して応答を取得するマルチスレッドアプリケーションを作成中です "OK"特定のコマンドに対する応答。serialport timeoutexceptionスレッドスイッチ

スレッドがReadLine()呼び出し中に切り替わり、TimeOutExceptionが発生する可能性があります。

タイムアウトは2000msに設定されています。

プログラムが数分間実行した後、私は(約5から10)ランダムTmeOutExceptionsを持って

23332 10:14:23 AM AutoLoader.WinS IRP_MJ_WRITE Serial0 SUCCESS Length 9: STG|4.5.. 
23336 10:14:23 AM AutoLoader.WinS IRP_MJ_READ Serial0 SUCCESS Length 1: O 
23339 10:15:54 AM AutoLoader.WinS IRP_MJ_WRITE Serial0 SUCCESS Length 7: GTSNS.. 
23342 10:15:54 AM AutoLoader.WinS IRP_MJ_READ Serial0 SUCCESS Length 3: K.. 
23347 10:15:54 AM AutoLoader.WinS IRP_MJ_WRITE Serial0 SUCCESS Length 7: GLSTS.. 
23351 10:15:54 AM AutoLoader.WinS IRP_MJ_READ Serial0 SUCCESS Length 1: O 
23355 10:15:54 AM AutoLoader.WinS IRP_MJ_READ Serial0 SUCCESS Length 3: K.. 

午前10時14分23秒AMの後、私は私が抑制さTimeOutExceptionを取得します。それがサービスされるまで

    while (response != "OK") 
        { 
         Thread.Sleep(1000); 

         _alComm.SendString("SSD|" + CurrentData.MeasuredDepthReturns + Environment.NewLine); 
         response = _alComm.ReceiveString(2000); 

         _alComm.SendString("STG|" + CurrentData.AvgGas + Environment.NewLine); 
         response = _alComm.ReceiveString(2000); 

         _alComm.SendString("GTSNS\r\n"); 
         response = _alComm.ReceiveString(2000); 
         SetSamplingTimePercent(response); 
        } 

public void SendString(string sDataToSend) 
{ 
    if (sDataToSend == "") 
     return; 

    try 
    { 
     AlPort.Write(sDataToSend); 
    } 
    catch (Exception ex) 
    { 
     //MessageBox.Show(ex.ToString(), "Error"); 
    } 
} 


public string ReceiveString(int timeOut) 
{ 
    string inString = null; 
    try 
    { 
     // set read timeout 
     AlPort.ReadTimeout = timeOut; 
     inString = AlPort.ReadLine(); 
    } 
    catch (TimeoutException ex) 
    { 
     return string.Empty; 
    } 

    return inString; 
} 
+0

コンテキストスイッチと同じように切り替えますか? – Tudor

+0

yes.aコンテキストスイッチ。 – cheedep

+0

いくつかのコードを投稿できますか? –

答えて

1

ReadLine(またはそのことについては、I/O)は、コンテキストスイッチが発生します。 I/Oは、その時にサービスされるまで

  1. スレッドのどちらかが経過タイムアウトするまでOSによって中断されたままと例外がスローされますか
  2. あなたが中断したまま:さて、私が見る方法は2つの可能性がありますOSはあなたのスレッドをただちに起きさせ、他のスレッドを優先してあなたのコードを実行できるようにします。どの現代的なOSでも、I/Oバウンドスレッドに優先順位をあげることができます。
+0

私は可能性を疑う1.それが事実であるかどうかを確認するために、どうすればよいのですか? – cheedep

+0

可能性がある場合(タイムアウトが経過する唯一のケース)は、シリアルポートが応答するのに時間がかかりすぎることを意味します。 – Tudor