2013-03-14 39 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