2011-10-21 2 views
2

私はWebBrowserを含むWinFormsアプリケーションで作業しており、別のプロセスのサービスとして動作します。私は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!"); 
    } 

これは私のクライアントは(!文字通り)しばらくの間凍結するよりも、他のOK動作します。クライアントの別のスレッドでbutton1_Clickを簡単に実行することができますが、実際にはNavigateAndWait(これは基本的にbutton1_Clickメソッドのコードの最後の3行になります)を実装しています。私はwhileのループがサービスのUIスレッドで実行されているため、DocumentCompleteイベントハンドラが呼び出されないため、これを試してみました。

だから私の質問は、私は私がそののスレッドで私のwhileループを行うことができますので、UIスレッド以外のスレッドで私のサービスの操作を実行するために、WCFを伝えることができる方法ですか?

+1

Bad: "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

関連する問題