當使用鎖的代碼塊中存在異常時,我遇到問題。我正在讀取和寫入串行端口,並且有幾個不同的線程需要訪問相同的串行端口。這是通過鎖來管理的。除非串口停止工作,否則我沒有任何問題。這可能會發生,因爲軟件控制射頻發射器,偶爾射頻可能會導致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
{
}
}
感謝所有幫助
你爲什麼把'lock'裏面的異常*放在'lock'的外部而不是'lock'的外部?你爲什麼要從非UI線程或甚至非UI代碼與用戶進行交互?將業務邏輯與用戶界面分開。 – Servy 2015-02-06 18:57:22
鎖只應包圍需要防止重入的代碼。在你的情況,看起來像port.Write是所有需要鎖定。 – Will 2015-02-06 18:58:10
@Will'if'也可能需要在'lock'內,假設'portOpened'與另一個線程共享。 – Servy 2015-02-06 18:59:06