转自
在代理调用BeginInvoke(new AsyncCallback(callBack), null);时,会抛这个异常的原因是该代理变量代理了一个以上的方法.
解决方法 Ⅰ.可以通过事件将这些方法打包在一起(假设打包的方法为AXPatch),然后再用代理调用这个打包的方法AXPatch().
////// 异步发送下行消息。/// /// 下行消息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<<<
Ⅱ.直接全部罗列要执行的方法到一个方法里(假设打包的方法为AXPatch),然后再用代理调用这个打包的方法【AXPatch()】. 通过事件处理的方法Ⅰ是异步进行的.不确定中......
经测试,方法Ⅰ是同步进行的,按照订阅事件的先后顺序执行.这个顺序不是随机的. 在.NET框架中,C#语言使用委托以及事件,可以很好的实现观察者模式。委托相当于“订阅清单”的角色,当目标中关联了该委托的事件被触发时,则委托将自动按序执行观察者注册于委托中的方法。 方法Ⅱ通俗易懂.
参考文章
, 感觉写的不是很详细.