2011-05-11 52 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