2010-08-10 2 views
0

여러 개의 .NET 어셈블리 (하나의 기본 실행 파일과 클래스 라이브러리 집합)로 분할 된 응용 프로그램을 개발 중입니다. 현재 WPF GUI를 사용하고 있지만 나중에 다른 GUI 프레임 워크로 전환 할 수있는 유연성을 유지해야합니다.C# .NET 이벤트 및 다중 스레드

여기 내 문제가 있습니다. 클래스 라이브러리 중 하나가 별도의 스레드에서 작업을 수행하고 해당 스레드가 완료되면 이벤트를 발생시킵니다. 신속하게 내 WPF GUI가이 이벤트 핸들러에서 구성 요소를 수정하려고 할 때 화가났다는 것을 알았 기 때문에 System.Windows.Threading.DispatcherTimer를 사용하여 주 스레드에서 이벤트를 전달하는 "이벤트 대기열"을 구현했습니다. 이것은 일을했다. 그러나이 DispatcherTimer가 WPF 응용 프로그램의 컨텍스트 내에서만 작동한다는 사실을 알게되어 놀랐습니다.

이 클래스 라이브러리 내에서 멀티 스레딩의 모든 추악한 내용을 숨기려고합니다. 결국 WPF가 아닌 GUI와 함께 사용할 수 있습니다. 아이디어는 소비하는 응용 프로그램이 이벤트 처리기 내에서 GUI를 업데이트 할 수 있어야한다는 것입니다. 그래서, 내 질문은 다른 스레드에서 이벤트를 발생시키는 표준 메서드 (특정 GUI 프레임 워크와 독립적)가 있습니까 ??

도움을 주시면 감사하겠습니다. 감사.

답변

1

ISyncronizeInvoke을 사용해야합니다. 이 인터페이스를 사용하면 올바른 스레드에 있는지 확인할 수 있으며 그렇지 않은 경우에는 올바른 스레드에서 메소드를 호출 할 수 있습니다. WPF에서이 작업을 수행하지는 않았지만 Windows Forms뿐만 아니라 거기에 구현되어 있다고 가정합니다.

1

일반적으로 주 스레드에서 이벤트 처리기를 다시 호출하여 주 스레드로 이벤트 데이터를 마샬링합니다. 하나의 방법이 아래에 나와 있습니다.

private void DispalyMessage(byte[] bytes) 
{ 
    if (this.InvokeRequired) 
    { 
    lock (_lock) 
    { 
     EventHandler d = new EventHandler(DispalyMessage); 
     this.Invoke(d, new object[] { bytes }); 
     return; 
    } 
    } 
    else 
    { 
    //do something with the data 
    } 
} 

즐기십시오!

1

당신은 사용할 수 있습니다 (BackgroundWorker는 않습니다 내가 믿는 것입니다) SynchronizationContext - 아니면 그냥 이벤트가 백그라운드 스레드에서 발생합니다 것을 고객에게 경고 수 있고, 그들이 필요 어떤 마샬링 수행해야 (FileSystemWatcher과 같은 다른 API를 사용하십시오.)

0

클래스 라이브러리의 이벤트 대신 GUI 코드에서 제공하는 콜백 메소드를 사용하십시오. 콜백은 라이브러리의 스레드에서 호출되지만 GUI 코드는 처리하는 가장 좋은 방법을 결정할 수 있습니다. 이렇게하면 다른 GUI로 쉽게 전환 할 수 있습니다.