Почему не работает GeckoFX Navigate (), если он запущен в отдельном потоке? - PullRequest
1 голос
/ 24 октября 2009

Почему это работает,

    private void buttonBoo_Click(object sender, EventArgs e)
    {
        GeckoBrowser.Navigate("http://www.google.com/");
    }

а это не так?

    private void buttonBoo_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(delegate()
        {
            GeckoBrowser.Navigate("http://www.google.com/");
        });

        thread.Start();
    }

Ответы [ 3 ]

7 голосов
/ 24 октября 2009

GeckoBrowser - это элемент управления Windows Forms. Свойства и методы элемента управления могут вызываться только из потока, в котором был создан элемент управления. Чтобы сделать что-либо с элементом управления из другого потока, вам необходимо использовать метод Invoke или BeginInvoke, например

Thread thread = new Thread(delegate()
{
  Action<string> action = url => GeckoBrowser.Navigate(url);
  GeckoBrowser.Invoke(action, new object[] { "http://www.google.com/" });
});
2 голосов
/ 13 августа 2011

Имейте в виду, что из-за базового движка XulRunner (XPCOM) компонент GeckoFX НЕ является многопоточным. Это потому, что XulRunner сам по себе является однопоточным временем выполнения.

0 голосов
/ 15 июля 2015

Это не работает, потому что Geckofx сам по себе не поддерживает кросс-потоки, если вы хотите сделать кросс-потоки, вам нужно сначала вызвать его.

    Thread thread = new Thread(delegate()
    {
         this.Invoke(new Action(() => {GeckoBrowser.Navigate("http://www.google.com/");}));
    });
...