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


    转自 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("
    ^^^^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("
    <<<<Dispatch " + message.ToString());
        }
    #endif
    }
    

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

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

    参考文章

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

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

  • 相关阅读:
    java的一些基本概念──JDK 、j2se 、j2sdk...
    shell函数的调用执行
    ICE第三方包简介及安装&ICE安装(linux)
    http状态码
    Grep命令学习笔记(转)
    STL map用法详解
    ubuntu下安装subversion客户端
    linux下安装Tomcat及设置JSP环境
    ICE总结
    struts开发
  • 原文地址:https://www.cnblogs.com/arxive/p/9024311.html
Copyright © 2020-2023  润新知