2011-10-21 119 views
2

我正在處理一個WinForms應用程序,該應用程序將包含WebBrowser並將充當另一個進程的服務。我想實現一個NavigateAndWait方法,但顯然,當我從客戶端調用我的服務(我的WinForms應用程序)方法時,此方法運行在同一線程中,或者以某種方式與服務的UI線程同步。這是我到目前爲止有:在服務線程之外的另一個線程上運行服務操作

服務:

public class Browser : IBrowser 
{ 
    private bool _Navigating = false; 

    public bool Navigating 
    { 
     get { return _Navigating; } 
    } 

    public Browser() 
    { 
     ServiceForm.Instance.webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
    } 

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     if(e.Url == ServiceForm.Instance.webBrowser1.Url) _Navigating = false; 
    } 

    public void Navigate(string url) 
    { 
     _Navigating = true; 
     ServiceForm.Instance.webBrowser1.Navigate(url); 
    } 
} 

客戶:(!直譯)

private void button1_Click(object sender, EventArgs e) 
    { 
     EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/PipeReverse/PipeReverse"); 
     NetNamedPipeBinding pipeBinding = new NetNamedPipeBinding(); 
     ChannelFactory<IBrowser> pipeFactory = new ChannelFactory<IBrowser>(pipeBinding, endpointAddress); 
     IBrowser browser = pipeFactory.CreateChannel(); 
     browser.Navigate("http://www.google.com"); 
     while (browser.Navigating) { } 
     MessageBox.Show("done!"); 
    } 

該工程確定,除了我的客戶將一小會兒凍結。我可以在客戶端的其他線程上輕鬆運行button1_Click,但我真正想要做的是在我的服務中實現我的NavigateAndWait(這基本上是button1_Click方法中的最後三行代碼)。但我試過這個,它永遠不會返回,顯然是因爲DocumentComplete事件處理程序永遠不會被調用,因爲我在服務的UI線程中運行while循環。

所以我的問題是我怎麼能告訴WCF在除了UI線程的線程上運行我的服務操作,所以我可以做我的while循環在其他線程?

+1

壞:「while(browser.Navigating){}」 – Steve

+0

@Steve:我應該用什麼來代替(考慮我正在嘗試編寫一個'NavigateAndWait'方法)? – Juan

+0

在你的IBrowser接口上放置一個事件,並從'webBrowser1_DocumentCompleted'方法中調用它? – Steve

回答

2

您需要在服務中的[ServiceBehavior]屬性中使用UseSynchronizationContext = false選項。這將告訴WCF不要強制將所有請求發佈到創建線程的位置(在您的情況下,UI線程)。該屬性將進入服務(不是接口)。

+0

這是不是強制_意味着它可能會在UI線程上運行,或者如果強制它不會呢? – Juan

+0

確定這工作。只需要確保它永遠不會運行在服務的UI線程上(除非我從UI線程調用它,當然)。你知道這是真的嗎? – Juan