BeginInvoke或者Invoke会出现类似死锁的效果?、、

crystal_lz 2014-05-29 01:37:51
其实是这样的 因为刚才想写一个程序去统计一个文本有多少行 文本可能比较多 所以就启了一个线程 但是悲剧的是 在线程里面 Invoke貌似卡住了的样子、、
代码如下

private long GetFileLine(string path) {
long line = 0;
using (StreamReader reader = new StreamReader(path)) {
while (reader.ReadLine() != null) {
line++;
label1.BeginInvoke( //换成Invoke就没有问题
new MethodInvoker(() => label1.Text = path + " -> " + line
));
}
}
return line;
}
//调用的地方、、、
new Thread(() => {
long line = GetFileLine("C:\\fuck.txt");
textBox3.Invoke(new MethodInvoker(() => { //断点到这句F5就回到界面上了
textBox3.Text = "what a fucking day"; //这句下断点 没反映不到这里来
}));
//后面的代码也不执行了
}) { IsBackground = true }.Start();

我分别在textBox3.Invoke和下面一句下了一个断点 到Invoke的时候F5直接就回到程序界面了 一直没有执行到对textbox赋值的那句 而且Invoke后面的代码也不执行了 但是程序界面又没有卡死
但是如果把GetFileLine 里面label用BeginInvoke的话又一切正常、、我郁闷了半天 开始以为那里写错了 然后 把那些多余的代码注释 变成上面那个样子 还是一样的效果 然后我就估摸着 肯定那里低级错误了 但是确实找到了 - -!、、
我的问题不是想问 怎么统计行 而是想知道 为什么代码到Invoke那里就不走了、、是不是 我知识面上漏了一点啥所以不知道正确的方式、、、
...全文
226 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdashewan 2014-05-29
  • 打赏
  • 举报
回复
完全没有楼主所描述描述现象,无论BeginInvoke还是Invoke,都执行并得到结果。至于BeginInvoke和Invoke一个是不阻断当前线程,在线程执行完后执行BeginInvoke内代码,另一个则是阻断当前线程,先执行Invoke内代码,无论用哪个对楼主代码都不构成影响。楼主所说什么“后面的代码也不执行了”,我想说线程的.Start(),怎么看也是比内部的BeginInvoke先执行 ,何来后面的代码之说,既然楼主用了这种代码书写方式而不用常规方式,应该不会认为代码是从上至下依次执行的吧。

110,538

社区成员

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

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

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