2012-06-06 2 views
3

필자는 브라우징 된 페이지 상태에 따라 많은 이벤트를 실행할 수있는 사용자 지정 브라우저 클래스가 있습니다. 이제 브라우저를 사용하여이 웹 페이지에서 일부 작업을 수행해야하지만 순차적으로 실행해야하며 각 작업에는 이전 작업의 데이터가 필요합니다. 이것을 달성하는 가장 확실한 방법은 브라우저가 작업을 수행하기를 기다리는 동기 메소드를 만드는 것입니다. 나는 이것을 다음과 같이 만들었다 :C# 이벤트 발생을 기다리는 동기 메서드를 만드는 방법은 무엇입니까?

public incomplete class MyClass { 
    // (...) lots of stuff comes here, it's a web browser :) 
    public bool MySyncMethod(object data) { 
     bool success = false; 
     bool wait = true; 
     MyEventHandler = new EventHandler((o, e) => { 
      data = MyEventProvidedData; // belive me, it's threre when it fired 
      success = true; // let's assume it always succeed 
      wait = false; // now we can move on to the rest of our long chain 
     }); 
     // (...) here I have some more event handlers which can end my method... 
     MyAsyncMethod(data); // so it started and will fire MyEventHandler soon 
     while (wait) System.Threading.Thread.Sleep(100); 
     return success; 
    } 
} 

그러나 무엇인가 잘못되었다. 스레드를 사용했다면 my while 루프 대신 myThread.Join()을 배치하고 스레드가 완료 될 때까지 기다릴 것입니다. 그것은 컨트롤과 관련된 이벤트와 함께 사용할 수있는 Thread.Join()과 비슷한 것입니까? while 루프 대신에 사용할 것이 있습니까? 그것은 내 목표를 달성하기위한보다 깨끗한 방법입니까? 위의 코드는 실제 앱에서 작동하지만 최적이 아니라고 생각합니다.

스레드를 사용하지 않는 좋은 이유가 있습니다. 스레드와 ActiveX 컨트롤 간의 모든 통신은 스레드로부터 안전해야하며, 이는 달성하기가 쉽지 않습니다. 네, 시도해 보았습니다 :)이 코드는 디버그하기에 좋았 기 때문에 다시 작성하기로했습니다. 이 작업을 사용할 수 있다면

+0

불완전 클래스? –

+0

'불완전한 '클래스 란 무엇입니까? –

+1

Monitor.Pulse의 예제 코드를 살펴 보았습니까? 여기 MSDN에서 : http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx –

답변

7

에 한번 사용으로 ManualResetEvent :

var wait = new ManualResetEvent(false); 
    var handler = new EventHandler((o, e) => wait.Set()); 
    MyAsyncMethod(data, handler); // so it started and will fire handler soon 
    wait.WaitOne(); 
+1

이것은 내가 필요한 것입니다. 감사. – Harry

+0

이것은 여러 유형의 Action 이벤트에도 적용됩니다. 따라서 위의 EventHandler를 Action 또는 Action이 무엇이든지간에 대체 할 수 있습니다. – NeoSkye

0

, 당신은 WaitAll Method

를 사용할 수 있습니다하지만 당신은 당신이 스레드를 사용할 수 없습니다 말한다. 여전히 asyncmethod는 일종의 스레딩을 시작해야하므로 일부 스레딩이 관련되어 있어야합니까? 문제가 asyncmethod가 활성 x 컨트롤이 작동하기 위해 원래 스레드에 다시 게시해야하는 경우 ASyncOperationManager (부끄러 움 자신의 블로그 게시물 링크 : http://blog.subrosoftware.nl/?p=42) 또는 MSDN link을 사용하여 스레드 콜백 문제를 해결할 수 있습니까?

+0

그래, 맞아 - 내가 스레드를 사용해야하지만, 난 크로스 스레드를 제한 할 수 있습니다 필요한 최소한의 전화. ActiveX에 직접 액세스 할 필요는 없지만 ActiveX 기반의 WebBrowser 구성 요소에 액세스해야합니다. Invoke를 사용하여 스레드로부터 안전하게 수행 할 수 있습니다. 따라서 브라우저를 사용하는 대부분의 코드는 스레드가 포함 된 브라우저를 포함하는 폼 클래스에서 수행됩니다. 단지 시작 작업과 데이터 수신은 Invokes가 필요하므로 매우 간단합니다. – Harry

관련 문제