回调函数被执行两次?

tnt8csdn2000 2005-03-03 06:03:34
初次使用异步委托,在MSDN上抄了些代码,用例跑起来没有什么问题,但是debugview显示回调函数被执行了两次,并且执行endinvoke的时候"出现未将对象设置到实例错误"(已被catch住),觉得有问题,但是查不出来,所以请高手指教.

public delegate void SendDelegate(string stringInformation);

//异步调用的地方
{
SendDelegate MySenderDelegate = new SendDelegate(AAA);
IAsyncResult ar = MySenderDelegate.BeginInvoke(stringInformation,new AsyncCallback(CallBackMethod) ,null);
}


//回调
private void CallBackMethod(IAsyncResult ar)
{
try
{
SendDelegate dlgt = (SendDelegate) ar.AsyncState;
dlgt.EndInvoke(ar);//这句话报错
}
catch(Exception ExceptionObj)
{
}
}
...全文
639 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixigongzhu 2005-03-04
  • 打赏
  • 举报
回复
CallBackMethod方法为什么会出错,那是因为dlgt对象为空。
当调用BeginInvoke时,最后一个参数如果传入NULL,EndInvoke方法的传入参数的AsyncState属性就为NULL。也就是说这个参数传入什么对象,AsyncState就是什么对象。
xixigongzhu 2005-03-04
  • 打赏
  • 举报
回复
IAsyncResult ar = MySenderDelegate.BeginInvoke(stringInformation,new AsyncCallback(CallBackMethod) ,MySenderDelegate);//MySenderDelegate很重要,必须传这个对象,否则EndInvoke肯定要出错
isaacyh 2005-03-04
  • 打赏
  • 举报
回复
这是我原来写的一个例子,你看看有没有帮助的说
http://community.csdn.net/Expert/topic/3649/3649200.xml?temp=.183758
isaacyh 2005-03-04
  • 打赏
  • 举报
回复
我也遇到过这样的问题。。。

后来发现是这样的(不知道与你的是否一样)
在MySenderDelegate.BeginInvoke(stringInformation,new AsyncCallback(CallBackMethod) ,null);
这句话中,你的new AsyncCallback(CallBackMethod)是作为一个参数传入的,所以系统在处理时其实是用了一个“+=”将这个 new AsyncCallback(CallBackMethod)加载在那个事件链上,并没有删除,每加一次就处理一次CallBackMethod,所以可能会出现多次"+=",多次调用CallBackMethod的问题。
isaacyh 2005-03-04
  • 打赏
  • 举报
回复
我也遇到过这样的问题。。。

后来发现是这样的(不知道与你的是否一样)
在MySenderDelegate.BeginInvoke(stringInformation,new AsyncCallback(CallBackMethod) ,null);
这句话中,你的new AsyncCallback(CallBackMethod)是作为一个参数传入的,所以系统在处理时其实是用了一个“+=”将这个 new AsyncCallback(CallBackMethod)加载在那个事件链上,并没有删除,每加一次就处理一次CallBackMethod,所以可能会出现多次"+=",多次调用CallBackMethod的问题。
sun926 2005-03-04
  • 打赏
  • 举报
回复
SendDelegate dlgt = (SendDelegate) ar.AsyncState;
应该改为:
SendDelegate dlgt = ((AsyncResult)ar).AsyncDelegate as SendDelegate;
//AsyncResult定义在System.Runtime.Remoting.Messaging中
xinminhuibaobao 2005-03-04
  • 打赏
  • 举报
回复
up
tnt8csdn2000 2005-03-04
  • 打赏
  • 举报
回复
up
isaacyh 2005-03-04
  • 打赏
  • 举报
回复
呵呵,还是 xixigongzhu(夕夕宝贝) 眼尖的说。。。
你也可以不传参数,写成

SendDelegate dlgt = (SendDelegate)((AsyncResult)ar).AsyncDelegate;

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧