如何从另一个线程调用或BeginInvoke控件

时间:2013-12-14 17:37:29

标签: c# multithreading geckofx

来自我使用

调用thread的课程
using (GeckoBrowserForm geckoBrowserForm = new GeckoBrowserForm(XulRunnerPath, propertyBag.ResponseUri.ToString()))
{
    geckoBrowserForm.show();
}

执行用户界面表单OnLoad(EventArgs e)

protected override void OnLoad(EventArgs e)
{
    GeckoWebBrowser m_GeckoWebBrowser = new GeckoWebBrowser();
    m_GeckoWebBrowser.Invoke(new Action(() => {
                m_GeckoWebBrowser.Parent = this;
                m_GeckoWebBrowser.Dock = DockStyle.Fill;
                m_GeckoWebBrowser.DocumentCompleted += (s, ee) =>
                {    
                    GeckoHtmlElement element = null;
                    var geckoDomElement = m_GeckoWebBrowser.Document.DocumentElement;
                    if (geckoDomElement != null && geckoDomElement is GeckoHtmlElement)
                    {
                        element = (GeckoHtmlElement)geckoDomElement;
                        DocumentDomHtml = element.InnerHtml;
                    }



      if (m_Url.Equals(m_GeckoWebBrowser.Document.Url.ToString(), StringComparison.OrdinalIgnoreCase))
                    {
                        Done = true;
                        //m_GeckoWebBrowser.Navigate("about:blank");
                        //m_GeckoWebBrowser.Document.Cookie = "";
                        //m_GeckoWebBrowser.Stop();
                    }
                };

                m_GeckoWebBrowser.Navigate(m_Url);
            }));
}

但问题是Invoke中的代码永远不会执行。为什么?如何在invoke中执行代码?

问题是GeckoBrowser是一个Windows窗体控件。 Control的属性和方法只能从创建Control的线程中调用。要从另一个线程对Control执行任何操作,您需要使用Invoke或BeginInvoke方法,例如但是如何?

1 个答案:

答案 0 :(得分:1)

在UI线程上调用

OnLoad,因此不需要调用。 除此之外,您还可以在类的构造函数中调用这些初始化步骤。

<强>更新: 要使用SynchronizationContext创建它:

void ThreadFunc(object args)
{
    ...
    var syncContext = (SynchronizationContext) args;
    syncContext.Send(new SendOrPostCallback(_ => {
        using (GeckoBrowserForm geckoBrowserForm = new GeckoBrowserForm(XulRunnerPath, propertyBag.ResponseUri.ToString()))
        {
            geckoBrowserForm.ShowDialog();
        }),
        null);
    ...
}