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!");
}
이 확인 다른 작동합니다. 나는 내 클라이언트의 다른 스레드에서 button1_Click
을 쉽게 실행할 수 있지만 실제로 수행하고자하는 것은 내 NavigateAndWait
(기본적으로 button1_Click
방법의 코드 마지막 세 줄)을 구현하는 것입니다. 그러나 나는 이것을 시도한 적이 있으며 반환하지 않습니다. 왜냐하면 서비스의 UI 스레드에서 실행중인 while
루프 내부에 있기 때문에 DocumentComplete
이벤트 핸들러가 호출되지 않기 때문입니다.
그래서 제 질문은 내가 그 다른 스레드에서 내 while
루프를 할 수 있도록 UI 스레드가 아닌 다른 스레드에서 내 서비스의 작업을 실행하는 WCF 말할 수있는 방법인가?
Bad : "while (browser.Navigating) {}" – Steve
@Steve : 대신 (NavigateAndWait 메서드를 작성하려는 경우) 무엇을 사용해야합니까? – Juan
IBrowser 인터페이스에 이벤트를 넣고 'webBrowser1_DocumentCompleted' 메소드에서 이벤트를 호출 하시겠습니까? – Steve