在代理调用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#语言使用委托以及事件,可以很好的实现观察者模式。委托相当于“订阅清单”的角色,当目标中关联了该委托的事件被触发时,则委托将自动按序执行观察者注册于委托中的方法。

方法Ⅱ通俗易懂.