2015-02-06 61 views
-1

當使用鎖的代碼塊中存在異常時,我遇到問題。我正在讀取和寫入串行端口,並且有幾個不同的線程需要訪問相同的串行端口。這是通過鎖來管理的。除非串口停止工作,否則我沒有任何問題。這可能會發生,因爲軟件控制射頻發射器,偶爾射頻可能會導致USB串口停止運行。如果您嘗試寫入端口,您將收到寫入超時。我試着從try-catch異常處理程序中處理這個問題。但是,該程序在那個時候很難鎖定,並且必須讓這個任務失效。我不確定這是否來自異常或我試圖顯示的消息框,因爲它可能來自後臺線程。下面是代碼:嘗試在鎖定的代碼塊中捕獲異常

 lock (_object) 
     { 
      try 
      { 
       if (portOpened) 
       { 
        port.Write(data); 
       } 

       else 
       { 
        MessageBox.Show("The radio is not connected. Please select a ComPort in the settings dialog"); 

       } 
      } 

      catch (Exception x) //this will capture a write exception. 
      { 
       MessageBox.Show("The program is unable to write to the serial port. Select OK to close the program"; 

       Application.Exit(); 

      } 

      finally 
      { 
      } 

     } 

感謝所有幫助

+4

你爲什麼把'lock'裏面的異常*放在'lock'的外部而不是'lock'的外部?你爲什麼要從非UI線程或甚至非UI代碼與用戶進行交互?將業務邏輯與用戶界面分開。 – Servy 2015-02-06 18:57:22

+0

鎖只應包圍需要防止重入的代碼。在你的情況,看起來像port.Write是所有需要鎖定。 – Will 2015-02-06 18:58:10

+1

@Will'if'也可能需要在'lock'內,假設'portOpened'與另一個線程共享。 – Servy 2015-02-06 18:59:06

回答

0

如果要強制退出應用程序,Application.Exit是不是一個很好的選擇,因爲它簡單地推動對所有線程的消息隊列的關閉請求,但不強制任何東西。如果您想不惜任何代價停止應用,請使用Environment.Exit(exitCode),或者可能更好Environment.FailFast,並指定異常,以便將其記錄到系統日誌中:便於未來調查。

+0

好多了 – Tom 2015-02-07 02:34:43