我正在處理一個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
循環在其他線程?
壞:「while(browser.Navigating){}」 – Steve
@Steve:我應該用什麼來代替(考慮我正在嘗試編寫一個'NavigateAndWait'方法)? – Juan
在你的IBrowser接口上放置一個事件,並從'webBrowser1_DocumentCompleted'方法中調用它? – Steve