Invoke为什么会多次执行?

callmesai 2012-09-11 01:51:45

int i = 0;
delegate void dg();

private void Test()
{
if (this.InvokeRequired)

dg callback = new dg(Test);
this.Invoke(callback);

else
{
i++;
Console(i.ToString());
}
}


结果多次调用Test()每次执行分别显示 1,3,6,10,15。。。。。。

为什么不是1,2,3,4,5???重复执行了吗?

另外Invoke和BeginInvoke的区别是什么?
...全文
575 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
callmesai 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
问题应该不在这几行代码中,应该在你线程中调用Test的代码有问题
[/Quote]

哦 找到问题了
是因为我new出来的BackgroundWorker每次按钮点击都DoWork += Test() 而没有重新new一次

谢谢楼上各位的帮忙和解析~
bdmh 2012-09-11
  • 打赏
  • 举报
回复
问题应该不在这几行代码中,应该在你线程中调用Test的代码有问题
sj490790083 2012-09-11
  • 打赏
  • 举报
回复
BeginInvoke是相对于调用他的线程异步执行的,会等UI线程上的操作完才执行
sj490790083 2012-09-11
  • 打赏
  • 举报
回复
i的值肯定在别的方法中也被修改了,另外,BeginInvoke是异步调用,(异步是指相对于调用BeginInvoke的线程异步)它必须等调用它的方法内部的其他操作在UI线程上执行完了才会执行,而Invoke是同步的。
callmesai 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
结果多次调用Test()每次执行分别显示 1,3,6,10,15。。。。。。

为什么不是1,2,3,4,5???重复执行了吗?

自己去找i在什么地方调用了,必然你是你自己其它代码的问题。
[/Quote]

而且我在i++处断点,的确是多次断下来

不明白为什么
zhleiyang 2012-09-11
  • 打赏
  • 举报
回复
Invoke是阻塞当前线程的,BeginInvoke不会的。
你这段代码能执行?
callmesai 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
结果多次调用Test()每次执行分别显示 1,3,6,10,15。。。。。。

为什么不是1,2,3,4,5???重复执行了吗?

自己去找i在什么地方调用了,必然你是你自己其它代码的问题。
[/Quote]

没有 我是临时加上i的 其他地方没有调用 目的就是想看看是不是多次执行了
bdmh 2012-09-11
  • 打赏
  • 举报
回复
断点调试
cheng2005 2012-09-11
  • 打赏
  • 举报
回复
结果多次调用Test()每次执行分别显示 1,3,6,10,15。。。。。。

为什么不是1,2,3,4,5???重复执行了吗?

自己去找i在什么地方调用了,必然你是你自己其它代码的问题。

110,567

社区成员

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

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

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