• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

回调函数被执行两次?

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)
{
}
}
...全文
237 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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;

回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2005-03-03 06:03
社区公告

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