私は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を伝えることができる方法ですか?
Bad: "while(browser.Navigating){}" – Steve
@ Steve:(NavigateAndWaitメソッドを記述しようとしているので)代わりに何を使うべきですか? – Juan
IBrowserインターフェイスにイベントを入れ、 'webBrowser1_DocumentCompleted'メソッドからイベントを呼び出しますか? – Steve