2013-03-14 58 views
1

大家好,我需要一個建議,我使用C#開發一個桌面應用程序(WinForm的),我有一個表格,我有一個名爲OPC分隔的類(其他文件)我應該使用事件嗎?

這是OPC類

的一些代碼

OPC類

namespace BarCodePrint.Class 
{ 
public class OPC 
{ 
    public OPCServer ConnectedOPCServer { get; set; } 
    public OPCGroups ObjOPCGroup {get; set;} 
    public OPCGroup ConnectedOPCGroup { get; set; } 
    public int _numItems { get; set; } 
    public string _nodeName { get; set; } 

    Array _OPCItemIDs; 
    Array _ItemServerHandles; 
    Array _ItemServerErrors; 
    Array _ClientHandles; 
    Array _RequestedDataTypes; 
    Array _AccessPaths; 
    Array _WriteItems; 

    public OPC() 
    { 
     //Code 
    } 

    public void OPCConnect() 
    { 
     //Code 
    } 

    public void OPCDisconnect() 
    { 
     //Code 
    } 

    public void AddGroupToOPC() 
    { 
     //Code 
    } 

    public void AddItemsToOPC() 
    { 
     //Code 
    } 

    public void Write() 
    { 
     //Code 
    } 


    private void ConnectedOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) 
    { 
     try 
     { 
      for (int i = 1; i <= NumItems; i++) 
      { 


       if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 1)) 
       { 
        //Do something 
       } 
      } 
     } 
     catch (Exception exc) 
     { 
      //HandleException 
     } 

    } 

} 
} 

的方法ConnectedOPCGroup_DataChange執行每次在設備中的值發生變化,我希望做的是,當值改變該數值發給形式,追求離子是:我應該使用事件嗎?或者把我的OPC類放在表單的同一個文件中?或者我可以用其他方式做到嗎?

我希望能解釋清楚。

感謝

+2

一個困境需要對比兩個潛在的選擇。你想考慮使用事件與什麼? – 2013-03-14 00:06:34

+0

事件vs以相同的形式實現該類 – 2013-03-14 00:21:47

+0

我建議編輯問題以將「OPC」添加到標題某處/添加opc標記。我喜歡看OPC問題,而且我很難找到這個問題。 – jrh 2017-03-27 22:00:25

回答

3

如果你問是否使用事件或是否只是直接調用的東西,這取決於你的使用情況。活動是播放動作的好方法。如果多個項目需要知道使用事件更改的內容,則可以解耦您的代碼。也就是說,如果你只關心告訴另外一段代碼,那麼你也可以這樣做。事件是在同一個線程上調度的,所以無論你直接調用訂閱者還是使用事件分派它,執行代碼都是在相同的上下文中處理的。

我個人喜歡使用事件來防止硬耦合。您的調度員代碼不需要知道誰在訂閱。它只是說「嘿,事情發生了,現在你工作了」。

事件也很整潔,因爲您可以將它們與Rx結合起來以獲得採樣和節流,並執行各種其他很酷的事情。

如果您發現您正在添加一堆額外的代碼來宣傳「發生了什麼事」,那麼您應該使用一個事件。

+0

是的是不止一個項目,我需要知道的價值,我在尋找的是一個最佳實踐 – 2013-03-14 00:19:13

0

有兩種方法可以從OPC服務器獲取數據:直接讀取或使用DataChange事件。這個選擇取決於你,一個或另一個不能被描述爲「最佳實踐」。如果您的問題僅僅是實現,那麼我可以告訴您,您的ConnectedOPCGroup_DataChange子版末尾缺少「 Handles ConnectedGroup.DataChange 」。你的OPCAutomation庫會生成事件,你只需要處理它。

要解決問題的第二部分,最好將OPC客戶端類與主窗體分開。

+0

注意:[C#沒有像VB.NET一樣的處理關鍵字](http:// stackoverflow .com/q/6130834/4975230),C#使用+ =來分配事件。 – jrh 2017-03-27 15:26:06