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!"); 
    } 

이 확인 다른 작동합니다. 나는 내 클라이언트의 다른 스레드에서 button1_Click을 쉽게 실행할 수 있지만 실제로 수행하고자하는 것은 내 NavigateAndWait (기본적으로 button1_Click 방법의 코드 마지막 세 줄)을 구현하는 것입니다. 그러나 나는 이것을 시도한 적이 있으며 반환하지 않습니다. 왜냐하면 서비스의 UI 스레드에서 실행중인 while 루프 내부에 있기 때문에 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

관련 문제