我弄了这么一个玩样....
当点击“开始执行”的时候会执行下面的代码
不过在我点击“开始执行”的时候时候窗体就卡死了。
有几个问题:
1、窗口为什么卡死。
btn的点击事件不是在另外一个线程运行的吗?而form窗体的显示不是主线程控制的吗?
假设那网页一直没有加载成功,一直在while循环里面。也应该不会响影到主线程控的form窗口的显示吧?那为什么窗体连拖动都不可以?
2、我这样判断网页是否加载成功的方法是不是正确的做法?
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》读读。
按钮点击后你是启动了另外一个县线程吗? 如果不是的话,他还是在主线程中执行的
form窗体上面的控件有时会同时触多不只一个事件,注意是同时,那么同时运行两个事件的话,如果不是多线程它是怎么办到的?
@yeopp:事件也是有顺序的,并不是真正的同时
@大芝麻: 谢谢,如果您熟悉webbrowser 的话,帮我看下第二个问题,可以吗?
@yeopp: 这个不了解了 SOORY
@yeopp:你把你的博文地址贴到闪存上让大家快点帮忙被
@大芝麻: 呵呵,还有这个东西,您不说我还不知道呢?
所有窗体事件全部在窗体所在UI线程中执行,对窗体的一切访问都必须保证在窗体所在UI线程进行,或者说窗体是单线程的东西,不允许多线程访问。
form窗体上面的控件有时会同时触多不只一个事件,注意是同时,那么同时运行两个事件的话,如果不是多线程它是怎么办到的?
@yeopp: 谢谢,再帮我看下第二个问题,可以吗?
@yeopp: 这种边Sleep边轮询的方式肯定是不对的。 WebBrowser应该是在UI线程上运行的, 所以我觉得可能只有(至少简单的方法只有)监听控件的DocumentLoaded之类的事件了(.net1.1时用过两回这玩艺,现在都忘光了,事件名称可能不叫这个,但肯定有相关的事件)。 或者你喜欢主动轮询方式的话,整一个timer来轮询。
@Todd Pointer: 是不是我在那里弄了个Thread.Sleep(500) 会暂时中断线程,影响webBrowser载入Document?
@yeopp: 据我所知,是这样的。 或者WebBrowser的文档载入例程一直在跑,可能早就已经完成,但因为你一直不让出UI线程,它没法完成加载(即把文档内容从IO线程递给UI线程)
using System.Threading; Console.WriteLine ( Thread.CurrentThread.ManagedThreadId);可以判断是一个线程中运行。
谢谢,如果您熟悉webbrowser 的话,帮我看下第二个问题,可以吗?
第二个问题,在this.webBrowser1.Navigated方法中判断。
是不是我在那里弄了个Thread.Sleep(500) 会暂时中断线程,影响webBrowser载入Document?