C#:非常奇怪的多线程WebBrowser事件行为

C#:非常奇怪的多线程WebBrowser事件行为,c#,multithreading,webbrowser-control,C#,Multithreading,Webbrowser Control,下面是一些简单的C代码: 其中MainFrm是一个简单的System.Windows.Forms,webBrowser是在MainFrm中添加的一个webBrowser控件(来自设计器工具箱) 我希望此代码可以: 一次显示多个MBOX,报告不同的TID(ProgressChanged事件在单独的线程中执行) 每次显示一个mbox,报告相同的TID(ProgressChanged事件在单个线程中执行) 相反,我看到的是一次有多个MBOX,报告的是同一个TID 顺便说一下,此TID也是线程Mai

下面是一些简单的C代码:

其中MainFrm是一个简单的System.Windows.Forms,webBrowser是在MainFrm中添加的一个webBrowser控件(来自设计器工具箱)

我希望此代码可以:

  • 一次显示多个MBOX,报告不同的TID(ProgressChanged事件在单独的线程中执行)
  • 每次显示一个mbox,报告相同的TID(ProgressChanged事件在单个线程中执行)
相反,我看到的是一次有多个MBOX,报告的是同一个TID

顺便说一下,此TID也是线程MainFrm在上执行的TID

我在这里遗漏了什么吗?因为这种行为在我看来非常违反直觉:在我看来它不应该发生,因为这意味着一个线程一次在两个地方执行(?)。这怎么可能

实际上,我发现这是因为我的应用程序中有一个bug。该错误是我依赖于事件将在同一线程上执行这一事实的结果,换句话说,它不可能在同一时间执行两次

谢谢


Corneliu。

这里没有多线程,它都发生在主UI线程上。您看到多个消息框是因为
MessageBox.Show
在主线程上启动了一个新的嵌套消息循环。然后在同一线程上重新输入
WebBrowser\u ProgressChanged
(递归,如果愿意的话)。检查VS调试器中的调用堆栈并查看。谢谢,这很有意义
    private void MainFrm_Load(object sender, EventArgs e)
    {
        webBrowser.ProgressChanged += WebBrowser_ProgressChanged;
        webBrowser.Navigate("https://www.google.com/");
    }

    private void WebBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
    {
        MessageBox.Show(String.Format("WebBrowser progress changed, TID = {0}", System.Threading.Thread.CurrentThread.ManagedThreadId));
    }