Invoke 堆栈溢出问题

wangxiao2008 2010-05-26 03:45:48
private delegate void MessageProcessorHandler(object msg);

private void MessageProcessor(object msg)
{

if (this.InvokeRequired)
{
try
{
MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);
this.Invoke(d, new object[] { msg });
return;
}
catch ()
{ }
}
......
......
}
程序执行这个方法时,到this.Invoke(d, new object[] { msg });句会包堆栈溢出的异常,程序会自动退出
程序刚开始运行是没有问题的,运行大概一小时左右的时候,就会出现异常现象,
看报出的错误应该是InvokeRequired一直是True,才会报堆栈溢出的异常,按理说执行完这句this.Invoke(d, new object[] { msg }); 再次进入这个方法InvokeRequired应该是False才对,请高手指点一下。
...全文
299 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiao2008 2010-05-28
  • 打赏
  • 举报
回复
问题解决了,谢谢大家!
其实很简单,我子线程那个dll用的是Debug模式的,把它换成Relase模式的就OK了。
这样的问题真是气死人了,让我找了两天。
呵呵,记住这个教训了。
Taiyangchen 2010-05-27
  • 打赏
  • 举报
回复
你的代码写法本身就有问题!

[Quote=引用 7 楼 zhgroup 的回复:]

你这个是递归调用了,
你应该先声名一个实现MessageProcessorHandler的该当,如
void ExecMessage(object msg)
{
}

在需要调用回调的时候执行
Invoke(new MessageProcessorHandler(ExecMessage),new object[]{msg});

你的程序
MessageProcessorHa……
[/Quote]

这个说的很对的

LZ你写的例子太像我公司的产品了以前我在公司时也常写这样的东西。我当时也出过你这样的问题。。
如何解决??

你该这样操作:

private   delegate   void   MessageProcessorHandler(object   msg); 

private void MessageProcessor(object msg)
{

if (this.InvokeRequired)
{
try
{
MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);
this.Invoke(new EventReceivedHandler(YourFunction), new object[] { sender,msg });

}
catch ()
{ }
}
...
private void YourFunction(object sender,EventArgs msg)
{
//你代码的操作
//只有这样做你才不会栈溢出

}
......
}



LZ希望我的回答对你有帮助!
Taiyangchen 2010-05-27
  • 打赏
  • 举报
回复
你的代码写法本身就有问题!

[Quote=引用 7 楼 zhgroup 的回复:]

你这个是递归调用了,
你应该先声名一个实现MessageProcessorHandler的该当,如
void ExecMessage(object msg)
{
}

在需要调用回调的时候执行
Invoke(new MessageProcessorHandler(ExecMessage),new object[]{msg});

你的程序
MessageProcessorHa……
[/Quote]

这个说的很对的

LZ你写的例子太像我公司的产品了以前我在公司时也常写这样的东西。我当时也出过你这样的问题。。
如何解决??

你该这样操作:

private delegate void MessageProcessorHandler(object msg);

private void MessageProcessor(object msg)
{

if (this.InvokeRequired)
{
try
{
MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);
this.Invoke(new EventReceivedHandler(YourFunction), new object[] { sender,msg });

}
catch ()
{ }
}
...
private void YourFunction(object sender,EventArgs msg)
{
//你代码的操作
//只有这样做你才不会栈溢出

}
......
}



LZ希望我的回答对你有帮助!
qldsrx 2010-05-27
  • 打赏
  • 举报
回复
那就有可能是事件太频繁了,要排队处理的委托太多,超过了堆栈的上限了。
wangxiao2008 2010-05-27
  • 打赏
  • 举报
回复
奇怪,我定义了一个计数器,程序居然没有大于1的情况,这个变量每次都在0,1,没有出现其他的值
运行了大概1小时,就又报异常了。
怎么会呢?
是事件触发的太频繁了?
我同事的机器2003系统就没有问题,我的xp系统就把这样的异常,不太理解,哪位能给解释一下吗?

qldsrx 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangxiao2008 的回复:]
导致堆栈溢出就是程序在一直运行if里面的语句造成的
错误应该是InvokeRequired一直是True,按理说执行完这句this.Invoke(d, new object[] { msg }); 再次进入这个方法InvokeRequired应该是False才对
不应该再一直调用MessageProcessorHandler d = new MessageProcessorHandler(Me……
[/Quote]
有例外情况,建议你设定一个全局变量,在InvokeRequired为true时,计数+1,当InvokeRequired为false时,计数-1。按理说该变量是不会大于1的,除非出现了你那种情况,或者并发频繁的情况。你将计数大于1时的信息输出到文件,记录下所有这种情况下的this.GetType().Name,看看你的this倒底是啥,如果不是主线程下的对象,你的this.Invoke执行后InvokeRequired仍旧为true。
wangxiao2008 2010-05-27
  • 打赏
  • 举报
回复
导致堆栈溢出就是程序在一直运行if里面的语句造成的
错误应该是InvokeRequired一直是True,按理说执行完这句this.Invoke(d, new object[] { msg }); 再次进入这个方法InvokeRequired应该是False才对
不应该再一直调用MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);句
但什么现象会导致InvokeRequired一直是True呢?
zhgroup 2010-05-27
  • 打赏
  • 举报
回复
你这个是递归调用了,
你应该先声名一个实现MessageProcessorHandler的该当,如
void ExecMessage(object msg)
{
}

在需要调用回调的时候执行
Invoke(new MessageProcessorHandler(ExecMessage),new object[]{msg});

你的程序
MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);
这里一直在不停的调用该函数,所以最后导致堆栈溢出
wangxiao2008 2010-05-27
  • 打赏
  • 举报
回复
期待对线程调用理解较深入的人的解答
草帽精神 2010-05-27
  • 打赏
  • 举报
回复
mark
兔子-顾问 2010-05-27
  • 打赏
  • 举报
回复
依次=>一次
兔子-顾问 2010-05-27
  • 打赏
  • 举报
回复
对于这种只执行依次的,最好就是用匿名方法
this.Invoke((EventHandler)(delegate
{
..你的代码
};));
qldsrx 2010-05-27
  • 打赏
  • 举报
回复
一看就知道他是复制了某处的代码,也没改好就拼上来的,不然不可能保留MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor); 后又去new一个新的委托,那样写才有问题呢。

至于楼主这种写法,是否有问题我不做表态,我只是想说这是微软推荐的写法。
wangxiao2008 2010-05-27
  • 打赏
  • 举报
回复
非常感谢楼上,但是我对你的写法不太理解
MessageProcessorHandler d = new MessageProcessorHandler(MessageProcessor);
this.Invoke(new EventReceivedHandler(YourFunction), new object[] { sender,msg });
Invoke的时候没有用到我定义的那个代理d,EventReceivedHandler是新定义的一个代理吗?
铛铛 2010-05-26
  • 打赏
  • 举报
回复

if (this.InvokeRequired)
{}
给去了,在试试
endy 2010-05-26
  • 打赏
  • 举报
回复
太高端了。。。。。。。。。。。。。。
PangXiangShan 2010-05-26
  • 打赏
  • 举报
回复
不太懂 顶一下
请叫我卷福 2010-05-26
  • 打赏
  • 举报
回复
没遇见,友情帮顶~
dlsgliss 2010-05-26
  • 打赏
  • 举报
回复
没遇到过啊,只能帮顶!

110,502

社区成员

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

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

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