Delegate(代理)异常:该委托必须有一个目标 Delegate(代理)异常:该委托必须有一个目标 对于事件不能调用BeginInvoke,可改用另外一层包装 浅谈Observer Pattern(观察者模式)及其在C#中的实现

转自 Delegate(代理)异常:该委托必须有一个目标

在代理调用BeginInvoke(new AsyncCallback(callBack), null);时,会抛这个异常的原因是该代理变量代理了一个以上的方法.

解决方法
Ⅰ.可以通过事件将这些方法打包在一起(假设打包的方法为AXPatch),然后再用代理调用这个打包的方法AXPatch().

/// <summary>
/// 异步发送下行消息。
/// </summary>
/// <param name="msg">下行消息</param>
public void Send(Message.CmppSubmit message)
{
    try
    {
        CmppSubmitHandler handler = new CmppSubmitHandler(this.SendInternal);


        handler.BeginInvoke(message,new AsyncCallback(this.SendCallback),message);
    
    }
    catch(Exception ex)
    {
        Sinosky.Diagnostics.EventLog.WriteEntry(this,ex);
    }
}

private void SendInternal(Message.CmppSubmit message)
{
    try
    {
        if(this.SubmitDispatched!=null)
        {
            this.SubmitDispatched(message);
        }
        else
        {
            Console.WriteLine("\n^^^^Throw " + message.ToString());
        }
    }
    catch(Exception e)
    {
        Sinosky.Diagnostics.EventLog.WriteEntry(this,e);
    }
}


private void SendCallback(System.IAsyncResult ar)
{
    Message.CmppSubmit message = ar.AsyncState as Message.CmppSubmit;

#if DEBUG
    if(message!=null)
    {
        Console.WriteLine("\n<<<<Dispatch " + message.ToString());
    }
#endif
}

 
Ⅱ.直接全部罗列要执行的方法到一个方法里(假设打包的方法为AXPatch),然后再用代理调用这个打包的方法【AXPatch()】.
通过事件处理的方法Ⅰ是异步进行的.不确定中......

经测试,方法Ⅰ是同步进行的,按照订阅事件的先后顺序执行.这个顺序不是随机的.
.NET框架中,C#语言使用委托以及事件,可以很好的实现观察者模式。委托相当于“订阅清单”的角色,当目标中关联了该委托的事件被触发时,则委托将自动按序执行观察者注册于委托中的方法。
方法Ⅱ通俗易懂.

参考文章

对于事件不能调用BeginInvoke,可改用另外一层包装 , 感觉写的不是很详细.

浅谈Observer Pattern(观察者模式)及其在C#中的实现

猜你喜欢

转载自www.cnblogs.com/arxive/p/9024311.html