委托的Invork()

dfcj1010 2011-09-29 10:39:51


private void button1_Click(object sender, EventArgs e)
{
fortest test = new fortest(NewMethod);
test.Invoke();
//NewMethod();
}

private static void NewMethod()
{
string aa = "";
for (int i = 0; i < 200; i++)
{
if (i == 198)
{
aa = "123";
MessageBox.Show(aa);
}
}
}


如果直接调用这个循环方法UI会死掉,但是如果用一个委托的Invoke方法则不会,原因是什么?
...全文
328 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfqsy 2011-10-08
  • 打赏
  • 举报
回复
不过每次委托我都用线程
lfqsy 2011-10-08
  • 打赏
  • 举报
回复
学习学习学习
EsMo 2011-10-08
  • 打赏
  • 举报
回复
以前一直觉得是一样的 所以看lz的说法觉得有点诧异。。。
以下摘自msdn
公共语言运行时为每个委托类型提供 Invoke 方法(使用与该委托相同的签名)。 不必从 C#、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器将自动调用此方法。 需要查找委托类型的签名时 Invoke 方法在 反射 上很有用。


l245382052 2011-10-08
  • 打赏
  • 举报
回复
围观 学习
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dfcj1010 的回复:]
200次循环内,差别很明显的[/Quote]

看不出来有什么差别。
hztltgg 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dfcj1010 的回复:]
引用 12 楼 hztltgg 的回复:

你确定不死?我怎么试了下,循环变量加大后,很明显是UI是死的,不管用不用Invoke

200次循环内,差别很明显的,次数太大的我也没试过。回调我了解,但是委托的Invoke到底是什么那位能给个准确的答案?
[/Quote]

不明白你的200次是什么意思?200吃太少了,几乎没有区别,都是立即结束,如果加大循环,
test.Invoke();也好NewMethod();也好,界面都是死掉的,除非你用BeginInvoke,这样界面不会死
hengxinyi 2011-10-08
  • 打赏
  • 举报
回复
我想委托里面有俩个异步方法,一个是Invoke,一个是BeginInvoke,俩个方法都是用线程池中的线程执行线程函数!
dfcj1010 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hztltgg 的回复:]

你确定不死?我怎么试了下,循环变量加大后,很明显是UI是死的,不管用不用Invoke
[/Quote]
200次循环内,差别很明显的,次数太大的我也没试过。回调我了解,但是委托的Invoke到底是什么那位能给个准确的答案?
liuyilin888 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hztltgg 的回复:]
楼主是不是想用test.BeginInvoke,但是发现这个方法还要参数,Invoke不需要参数,不知道填什么吧?那个是回调方法,你这儿不用回调,直接给两个null就行了呀
[/Quote]
应该是
hztltgg 2011-09-29
  • 打赏
  • 举报
回复
楼主是不是想用test.BeginInvoke,但是发现这个方法还要参数,Invoke不需要参数,不知道填什么吧?那个是回调方法,你这儿不用回调,直接给两个null就行了呀
hztltgg 2011-09-29
  • 打赏
  • 举报
回复
你确定不死?我怎么试了下,循环变量加大后,很明显是UI是死的,不管用不用Invoke
Icedmilk 2011-09-29
  • 打赏
  • 举报
回复
那个传递的是个回调啦,不是你想的那回事
BeginInvoke肯定要起新线程
Invoke跟直接调用没啥区别
[Quote=引用 10 楼 dfcj1010 的回复:]
调用委托的BeginInvoke异步方法需要将委托对象给传过去,但是用Invoke方法则不需要,我知道如果调用BeginInvoke就相当于另起一个线程,但是Invoke呢?它相当于什么?运行的时候还是由当前线程执行吗?
[/Quote]
dfcj1010 2011-09-29
  • 打赏
  • 举报
回复
调用委托的BeginInvoke异步方法需要将委托对象给传过去,但是用Invoke方法则不需要,我知道如果调用BeginInvoke就相当于另起一个线程,但是Invoke呢?它相当于什么?运行的时候还是由当前线程执行吗?
shihaojie1219 2011-09-29
  • 打赏
  • 举报
回复
直接调用的话UI线程一直在处理循环,所以界面假死了。用BeginInvoke是异步调用,所以UI线程还能处理界面事件,不会假死。
liuyilin888 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icedmilk 的回复:]
楼上的搞什么灰机

Invoke必须不是异步调用

BeginInvoke才是异步调用
[/Quote]
这才是真理
Icedmilk 2011-09-29
  • 打赏
  • 举报
回复
楼上的搞什么灰机

Invoke必须不是异步调用

BeginInvoke才是异步调用
liuyilin888 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mabaolin 的回复:]
同步(直接调用)、异步(invoke)。
[/Quote]
有根据吗?
绝代坏坏 2011-09-29
  • 打赏
  • 举报
回复
异步和同步的区别。
flyerwing 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mabaolin 的回复:]
同步(直接调用)、异步(invoke)。
[/Quote]
顶一了
dfcj1010 2011-09-29
  • 打赏
  • 举报
回复
fortest是定义的委托
加载更多回复(2)

110,568

社区成员

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

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

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