委托实例(异步)

1.定义委托
     /// <summary>
    /// 设备状态发生改变委托定义
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="pArg">设备状态事件改变参数</param>
    public delegate void DeviceStateChangedEventHandler(object sender, DeviceStateEventArgs pArg);

2.定义事件
 /// <summary>
/// 设备状态改变事件
/// </summary>
public IntegrateDelegateAndEventLib.DeviceStateChangedEventHandler OnDeviceStateChangedEventHandler;

3.注册事件
 m_gc.OnDeviceStateChangedEventHandler += CommunicateModuleDataInteraceLogic_OnDeviceStateChangedEventHandler;

  4.定义事件执行方法
  #region【方法:设备状态改变事件响应方法】
        private void CommunicateModuleDataInteraceLogic_OnDeviceStateChangedEventHandler(object sender, IntegrateDelegateAndEventLib.DeviceStateEventArgs pArg)
        {
            this.InvokeMethod(() =>
            {
                switch ((ChannelStateEnum)pArg.ChannelStateEnum)
                {
                    case ChannelStateEnum.Natural:
                        tsslStatus.Text = "连接状态:已连接";
                        break;
                    case ChannelStateEnum.Fault:
                        tsslStatus.Text = "连接状态:未连接";
                        break;
                    default:
                        tsslStatus.Text = "设备状态:未连接";
                        break;
                }
            });
        }
        #endregion

5.调用执行
if (OnChannelStateChangedEvent != null)
                                    IntegrateDelegateAndEventLib.IntegrateEventDefine.DeviceStateChangedEvent(DateTime.Now, m_DeviceModel.ChannelState, DateTime.Now, OnDeviceStateChangedEventHandler);

6.提交异步执行方法
  #region 【方法:提交设备状态改变事件】
        /// <summary>
        /// 提交设备状态改变事件
        /// </summary>
        /// <param name="pDeviceID">设备编号</param>
        /// <param name="pDeviceStateEnum">设备状态</param>
        /// <param name="pDeviceStateTime">状态时间</param>
        /// <param name="pChannelStateEnum">通道状态</param>
        /// <param name="pChannelStateTime">通道时间</param>
        /// <param name="pHandler">事件</param>
        public static void DeviceStateChangedEvent(DateTime pDeviceStateTime, int pChannelStateEnum, DateTime pChannelStateTime, DeviceStateChangedEventHandler pHandler)
        {
            if (pHandler != null)
            {
                try
                {
                    DeviceStateEventArgs arg = new DeviceStateEventArgs( pDeviceStateTime, pChannelStateEnum, pChannelStateTime);
                    foreach (DeviceStateChangedEventHandler handler in pHandler.GetInvocationList())
                    {
                        handler.BeginInvoke(null, arg, new AsyncCallback(DeviceStateChangedEndAsync), null);
                    }
                }
                catch (Exception ee)
                {
                    //LogLib.Log.WriteError(ee);
                }
            }
        }
        #endregion


 #region 【方法:提交设备状态改变异步方法】
        /// <summary>
        /// 提交设备状态改变异步方法
        /// </summary>
        /// <param name="ar"></param>
        private static void DeviceStateChangedEndAsync(IAsyncResult ar)
        {
            DeviceStateChangedEventHandler d = null;
            try
            {
                AsyncResult asres = (AsyncResult)ar;
                d = ((DeviceStateChangedEventHandler)asres.AsyncDelegate);
                d.EndInvoke(ar);
            }
            catch (Exception ex)
            {
                //LogLib.Log.WriteError(ex);
            }
        }
        #endregion
原文地址:https://www.cnblogs.com/yanranziruo/p/10429991.html