2009-09-13 18 views
56

HTML sayfasında uygulanan CSS stilleri hakkında bilgi almam gerekir. AxWebBrowser kullandı ve IHTMLDOMNode'u yineledim. İhtiyacım olan tüm verileri alabiliyorum ve kodu uygulamaya geçirebiliyorum. Sorun şu ki bu kısım arka plan işçisinin içinde çalışıyor ve kontrolü başlatmaya çalışırken istisna yapıyorum.Tek iş parçacıklı daire - ActiveX denetimini başlatılamıyor

AxWebBrowser browser = new AxWebBrowser(); 

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated 
because the current thread is not in a single-threaded apartment. 

Bu veya AxWebBrowser'dan başka bir seçeneği nasıl çözebiliriz?

cevap

68

İçinde bulunduğunuz sorun, arka plan iş parçacığı/çalışan API'larının çoğunun iş parçacığını Çoklu İşlenmiş Daire durumunda oluşturmasıdır. Hata iletisi, denetimin iş parçacığının bir Tek Dişli Daire olmasını gerektirdiğini gösterir.

Kendiniz bir iş parçacığı oluşturarak ve iş parçacığındaki STA apartman durumunu belirterek çalışabilirsiniz. Devam edin ve uygulamanın ana girişine [STAThread] eklemek

var t = new Thread(MyThreadStartMethod); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
+1

Teşekkürler, bu işe yarıyor. Bir soru daha var. Kullanıyorum sınıf sadece sınıf ve AxWebBrowser bu.Controls() içine eklenmesi gerekiyor gibi görünüyor. Kontrolleri nasıl taklit etmenin yolu var mı? Yoksa bunun için ayrı bir form almam gerekecek mi? –

+0

@ martin.malek Bunu yapmanın harika bir yolu yok. En iyi bahis yeni bir form oluşturmaktır. – JaredPar

+1

Merhaba, kod t.SetApartmentState (ApartmentState.STA) olmalıdır; –

50

, bu COM iş parçacığı modeli tek iş parçacıklı olduğunu gösterir (STA)

örnek:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new WebBrowser()); 
    } 
} 
+0

konsol uygulamamın çalışması için güzel ve hızlı bir çözüm – Esen

+0

hoş bir çözüm! teşekkürler –

+0

framework 4.5 çalışmıyor - son satırda geçersiz argümanlar verir –

3

ise Uygulamanızın ana girişine [STAThread] kullandınız ve hala aşağıdaki gibi bir kontrol için Thread-Safe arama yapmak gerekebilir hata alabilirsiniz. Benim durumumda aynı sorunla birlikte şu çözüm işe yaradı!

Private void YourFunc(..) 
{ 
    if (this.InvokeRequired) 
    { 
     Invoke(new MethodInvoker(delegate() 
     { 
      // Call your method YourFunc(..); 
     })); 
    } 
    else 
    { 
     /// 
    } 
+0

Burada ne çağrılmalıdır? Tarayıcı? Hangi durumda? Benim durumumda tarayıcı bir diyalog üzerinde oturuyor. – C4u

İlgili konular