2010-12-07 32 views
1

我在這裏遇到了一個小問題: 我使用的是串行端口通信 - 我所有的通信功能。被包裝到我自己的serialport類中。該類的實例 都應該僅在在while循環中使用模式

using(Serport port = new Serport(...)){} 

可以用來保證,即處置()被操作之後被調用。

現在這是一次性調用沒有問題,但我想不出一種方式: 我有一個函數,應該通過while循環來調用,通過comport永久刷新,直到用戶中斷(該函數被設計爲在每次被調用時重置計時器本身,當不再被調用時超時)。 現在這個操作對時間非常重要,每次調用時都不能打開和關閉串口。所以使用該函數內部的使用模式將無法工作(或將它?) 要想實現這一點,我能想到的唯一方法是將using(){}放在while循環周圍 - 我想爲了避免這一點,雖然它會混淆我的代碼,這是清楚地建立在一種方式,該comport訪問處理低級別,並真正的應用程序只有簡單的功能,所有的工作都可用...

你大家看到其他選擇嗎?有沒有辦法用手來終止使用模式?只需在我的超時定時器中手動調用Dispose()將不起作用,因爲如果我得到異常,它將不會被調用 - 並且我必須確保Dispose()被調用,以便serialport保持可管理狀態。

感謝您的幫助!

+1

一個代碼示例將有助於... – cdhowie 2010-12-07 07:30:01

+0

如果您的問題是反覆創建和處置串行端口連接(這就是爲什麼您不想使用該函數中的`using`語句),爲什麼會手動調用`Dispose`會更好嗎? – 2010-12-07 07:33:41

+0

因爲我可以手動從超時定時器的.Elapsed-Event中調用Dispose(),只有當函數不再被調用時纔會到達。但是如果我用手調用,我沒有using(){}指令的保證,即使我得到異常(例如ReadTimeout或類似的東西),也會調用Dispose()。 – Lorenz 2010-12-07 07:54:38

回答

1

你並不需要使用一個IDisposable的一個using聲明:

MSDN

using語句確保 處置是即使當你調用發生異常 稱爲方法 上的對象。通過將對象 置於try塊內,然後調用 在finally塊中處理,可以實現 的相同結果;實際上, 這是怎麼使用的語句是由編譯器翻譯的 。該代碼 例如前面擴展到在編譯時 下面的代碼(注意 額外的花括號創建該對象的 範圍有限):

{ 
    Font font1 = new Font("Arial", 10.0f); 
    try 
    { 
    byte charset = font1.GdiCharSet; 
    } 
    finally 
    { 
    if (font1 != null) 
     ((IDisposable)font1).Dispose(); 
    } 
} 

您可以確保您的異常處理確實調用Dispose,也可以例如使自IDisposable一些外父類繼承:

void Parent.Dispose() 
{ 
    if (port != null) 
    { 
    port.Dispose(); 
    } 
} 

,敷P的創作沒有對象在using聲明中,並且讓擔心在調用上調用Dispose。

0

你會希望你的串口在整個會話期間都打開,因爲如果你經常打開/關閉它,你肯定會丟失數據並破壞你想要的任何協議。

如果你想分享你的串行通信在幾個其他的對象,這是完全不同的故事。

因此,嘗試打開它一次,關閉並處理它,當真的不再需要。

結論:使用'使用'在這裏沒有多少實際意義。