如何知道它是否是委托事件回调中的 reader?

How to know if it is a reader in a delegate event callback?

我有一个关于回调的问题。

我有两种形式(VS2010)。

我制作了一个 class,当“'valueIN'”发生变化时引发事件。

我在我的 class 中设置了一个委托,以便任何表单在更改时都可以获取 ValueIN。

问题

我创建了 Form2 对象并 link 对其进行回调,以便它能够获取“'valueIN'”。但是如果 form2 对象没有被实例化,运行 时间告诉我没有对象的实例化。 所以我想知道我怎么知道 Form2 存在于我的 WorkingStation 中。 这一行:SetValueINValCallback(value_received); 应该看起来像(在工作站中查看 Form2):if(SetValINCallbackFn.exists) SetValueINValCallback(value_received);

Form2

namespace DelegateTest
{
    using Beckhoff.App.Ads.Core;
    using Beckhoff.App.Ads.Core.Plc;
    using TwinCAT.Ads;
    using System.IO;

    public delegate void DEL_SetValIN(Single value);//test event

    public partial class Form1 : Form
    {
        IBAAdsServer _adsServer;
        WorkingStation WorkStation;
        public Form1()
        {
            InitializeComponent();
            WorkingStation WorkStation = new WorkingStation(_adsServer);
        }

        private void btn_Frm2Open_Click(object sender, EventArgs e)
        {
            Form2 Form2Test = new Form2();
            WorkStation.SetValueINValCallback += new DEL_SetValIN(Form2Test.SetValINCallbackFn);
            Form2Test.Show();
        }
    }
}

namespace DelegateTest
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public void SetValINCallbackFn(Single Value_received)//refresh valueIN
        {
            label1.Text = Value_received.ToString("F1");
        }
    }
}

工作站

namespace DelegateTest
{
    using System;
    using System.Collections.Generic;
    using System.IO;

    using System.Windows.Forms;//msgbox
    using Beckhoff.App.Ads.Core;
    using Beckhoff.App.Ads.Core.Plc;
    using TwinCAT.Ads;

    public class WorkingStation
    {//working station class
        public DEL_SetValIN SetValueINValCallback;

        private static IBAAdsCncClient _cncClient;
        private static IBAAdsPlcClient _plcClient;
        public static List<IBAAdsNotification> _notifications;

      //no need  public event System.EventHandler e_RefreshValueIN;//Input value has changed

        public WorkingStation(IBAAdsServer _adsServer)                  //constructor
        {
            try
            {
                _cncClient = _adsServer.GetAdsClient<IBAAdsCncClient>("CNC");
                _plcClient = _adsServer.GetAdsClient<IBAAdsPlcClient>("PLC");
                _notifications = new List<IBAAdsNotification>();

                var _refreshValueIN = new OnChangeDeviceNotification("GlobalVar.PLC.valueInput", ValINHasChanged);//event handler value
                _plcClient.AddPlcDeviceNotification(_refreshValueIN);
                _notifications.Add(_refreshValueIN);
            }
            catch (Exception Except)
            { MessageBox.Show("Error init object:" + Except.Message); }
        }
        ~WorkingStation()//destructor
        {
            foreach (var notify in _notifications)
            {
                _plcClient.RemovePlcDeviceNotification(notify);
            }
        }
        protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
        {//event method
            Single value_received = 0;
            try
            {
                value_received = _plcClient.ReadSymbol<Single>("valueInput");
                SetValueINValCallback(value_received);
               //no need   EventHandler E_VIChange = e_RefreshValueIN;
               //no need   if (E_VIChange != null)
               //no need       E_VIChange(this, EventArgs.Empty);
            }
            catch (Exception except)
            {
                MessageBox.Show("bad event (valueIN): " + except.Message);
            }
        }
    }
}

或者是否存在另一种将事件从 class 传递到多个表单的方法?

例如,我需要这些值来在 Form2 中绘制图表。

在此先感谢您的帮助!

抱歉,我没有看到我正在发起一个活动。 如果我做了一个delegate就是订阅事件,那么我不需要有raising事件,我只需要订阅。 引发错误的原因是,如果您编写如下事件:

 protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
    {//event method
        {
          EventHandler E_VIChange = e_RefreshValueIN;
          if (E_VIChange != null)
          E_VIChange(this, EventArgs.Empty);
        }

您需要有一个像

这样的订阅者
subscriber += new EventHandler... and so on

而且您不再需要它了,因为您有完成这项工作的代表。所以您只需订阅委托回调即可获得您的信息。

抱歉浪费时间。

此致