首页 新闻 会员 周边

请教有关多线程和winform有关的问题

0
[已解决问题] 解决于 2013-11-18 10:46

我弄了这么一个玩样....

 

当点击“开始执行”的时候会执行下面的代码


不过在我点击“开始执行”的时候时候窗体就卡死了。


有几个问题:


1、窗口为什么卡死。
btn的点击事件不是在另外一个线程运行的吗?而form窗体的显示不是主线程控制的吗?
假设那网页一直没有加载成功,一直在while循环里面。也应该不会响影到主线程控的form窗口的显示吧?那为什么窗体连拖动都不可以?


2、我这样判断网页是否加载成功的方法是不是正确的做法?

yeopp的主页 yeopp | 菜鸟二级 | 园豆:319
提问于:2013-11-17 21:20
< >
分享
最佳答案
0

1,因为你的 while(true) 阻塞了 UI 线程.

2,目前还没有很好的机制来判断页面加载完成,比如对于嵌入 iframe 的页面.这就好比你永远不知道什么时候是用户最后一次点击一样.相关问题,你可以看这里:http://www.cnblogs.com/joeblackzqq/archive/2010/12/25/1916627.html

对于你的第 1 个问题,可以肯定的告诉你,UI 采用的是单线程模型,任何和 UI 相关的操作都是排队执行的.或许你可以从这里:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html 简单了解下 UI 的消息机制.深入的阅读,你可以买本《深入浅出MFC》读读。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-11-18 09:31
其他回答(4)
0

按钮点击后你是启动了另外一个县线程吗? 如果不是的话,他还是在主线程中执行的

大芝麻 | 园豆:4 (初学一级) | 2013-11-17 21:27

form窗体上面的控件有时会同时触多不只一个事件,注意是同时,那么同时运行两个事件的话,如果不是多线程它是怎么办到的?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 21:57

@yeopp:事件也是有顺序的,并不是真正的同时 

支持(0) 反对(0) 大芝麻 | 园豆:4 (初学一级) | 2013-11-17 21:58

@大芝麻: 谢谢,如果您熟悉webbrowser 的话,帮我看下第二个问题,可以吗?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 21:59

@yeopp: 这个不了解了 SOORY

支持(0) 反对(0) 大芝麻 | 园豆:4 (初学一级) | 2013-11-17 22:01

@yeopp:你把你的博文地址贴到闪存上让大家快点帮忙被 

支持(0) 反对(0) 大芝麻 | 园豆:4 (初学一级) | 2013-11-17 22:02

@大芝麻: 呵呵,还有这个东西,您不说我还不知道呢?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 22:03
0

所有窗体事件全部在窗体所在UI线程中执行,对窗体的一切访问都必须保证在窗体所在UI线程进行,或者说窗体是单线程的东西,不允许多线程访问。

Todd Pointer | 园豆:379 (菜鸟二级) | 2013-11-17 21:38

form窗体上面的控件有时会同时触多不只一个事件,注意是同时,那么同时运行两个事件的话,如果不是多线程它是怎么办到的?

支持(1) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 21:57

@yeopp: 谢谢,再帮我看下第二个问题,可以吗?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 22:01

@yeopp: 这种边Sleep边轮询的方式肯定是不对的。 WebBrowser应该是在UI线程上运行的, 所以我觉得可能只有(至少简单的方法只有)监听控件的DocumentLoaded之类的事件了(.net1.1时用过两回这玩艺,现在都忘光了,事件名称可能不叫这个,但肯定有相关的事件)。 或者你喜欢主动轮询方式的话,整一个timer来轮询。

支持(0) 反对(0) Todd Pointer | 园豆:379 (菜鸟二级) | 2013-11-17 22:11

@Todd Pointer: 是不是我在那里弄了个Thread.Sleep(500) 会暂时中断线程,影响webBrowser载入Document?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-18 07:40

@yeopp:  据我所知,是这样的。 或者WebBrowser的文档载入例程一直在跑,可能早就已经完成,但因为你一直不让出UI线程,它没法完成加载(即把文档内容从IO线程递给UI线程)

支持(0) 反对(0) Todd Pointer | 园豆:379 (菜鸟二级) | 2013-11-18 12:49
0

using System.Threading;    Console.WriteLine ( Thread.CurrentThread.ManagedThreadId);可以判断是一个线程中运行。

易顺金 | 园豆:2 (初学一级) | 2013-11-17 21:48

谢谢,如果您熟悉webbrowser 的话,帮我看下第二个问题,可以吗?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-17 21:58
0

第二个问题,在this.webBrowser1.Navigated方法中判断。

nil | 园豆:879 (小虾三级) | 2013-11-17 23:06

是不是我在那里弄了个Thread.Sleep(500) 会暂时中断线程,影响webBrowser载入Document?

支持(0) 反对(0) yeopp | 园豆:319 (菜鸟二级) | 2013-11-18 07:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册