필자는 브라우징 된 페이지 상태에 따라 많은 이벤트를 실행할 수있는 사용자 지정 브라우저 클래스가 있습니다. 이제 브라우저를 사용하여이 웹 페이지에서 일부 작업을 수행해야하지만 순차적으로 실행해야하며 각 작업에는 이전 작업의 데이터가 필요합니다. 이것을 달성하는 가장 확실한 방법은 브라우저가 작업을 수행하기를 기다리는 동기 메소드를 만드는 것입니다. 나는 이것을 다음과 같이 만들었다 :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 컨트롤 간의 모든 통신은 스레드로부터 안전해야하며, 이는 달성하기가 쉽지 않습니다. 네, 시도해 보았습니다 :)이 코드는 디버그하기에 좋았 기 때문에 다시 작성하기로했습니다. 이 작업을 사용할 수 있다면
불완전 클래스? –
'불완전한 '클래스 란 무엇입니까? –
Monitor.Pulse의 예제 코드를 살펴 보았습니까? 여기 MSDN에서 : http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx –