zoukankan      html  css  js  c++  java
  • 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#中的实现

  • 相关阅读:
    排序sort (一)
    c++实现二叉树笔记(模板实现)(三)
    树(二叉树)的建立和遍历算法(二)
    IO流之字节流
    计算机基础知识
    计算机启动过程
    2020软考报名计划表
    2020软件工程作业02
    初来乍到 20200904
    关于考研
  • 原文地址:https://www.cnblogs.com/arxive/p/9024311.html
Copyright © 2011-2022 走看看