2011-05-11 118 views
0

我有一個解析某個網站的dll。此組件使用Navigate()方法使用Windows窗體中的WebBrowser控件。WCF和WebBrowser。線程問題

另外我有一個WCF寄宿在IIS 7和basicHttpBinding。

但是當我打電話其中使用DLL與WebBrower從客戶端我的WCF方法,我有這樣的錯誤消息:

ActiveX控件「{8856F961-340A-11D0-A96B-00c04fd705a2」不能被實例化,因爲當前線程不在單線程的公寓裏。

有什麼辦法來解決這種不愉快的情況?

回答

0

幸運的是,我找到了問題的答案。此代碼可以幫助我:

[STAThread] 
    public Good GrabGood(string link) 
    { 
     _link = link; 
     var t = new Thread(Grab); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
     t.Join(); 

     return _good; 
    } 
    private Good _good; 
    private string _link; 
    private void Grab() 
    { 
     var grabber = new GoodsGrabber(); 
     try 
     { 
      _good = grabber.GrabGood(_link); 
     } 
     catch (Exception) 
     { 
      _good = null; 
      throw; 
     } 
    } 

而這種屬性的類,如:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)] 

在任何選項的變化並沒有幫助我。

+1

就需要在WCF界面後面運行WebBrowser而言,我們處於同樣的情況。以這種方式創建線程確實解決了STA問題,但是'ThreadButser.DocumentCompleted'事件在'Thread.Join()'返回控制之前不會引發。您是否在「GoodsGrabber」內部阻止,以確保在WCF返回之前您想要實際執行的任何事情都發生在網頁上? – nateirvin 2012-11-05 23:07:35

+0

在此處查看完整代碼:[link](http://stackoverflow.com/questions/18739978/generated-image-of-html-page-not-showing-the-gradient-color-in-the-generated-ima) – Dror 2014-04-04 10:41:47