별도의 스레드에서 자체 이벤트 디스패처를 실행하는 프레임 워크를 사용하고 있습니다. 프레임 워크는 일부 이벤트를 생성 할 수 있습니다.C#의 스레드 간 이벤트 처리
class SomeDataSource {
public event OnFrameworkEvent;
void FrameworkCallback() {
// This function runs on framework's thread.
if (OnFrameworkEvent != null)
OnFrameworkEvent(args);
}
}
이러한 이벤트를 Winforms 스레드의 Winforms 개체에 전달하려고합니다. 나는 분명히 InvokeRequired
를 확인하고 필요한 경우 Winforms 스레드로 전달합니다.
class SomeForm : Form {
// ...
public void SomeAction(SomeArgs args) {
if (InvokeRequired) {
BeginInvoke(new Action(SomeAction), args);
return;
}
// ...
}
}
이제 이벤트는 폼이 모든 종류의 문제가 발생하는 폐쇄되는 과정에있을 때 배달, 그래서 같이 윈폼 스레드에서 프레임 워크의 이벤트 소스에서 폼의 이벤트 핸들러의 등록을 취소 할 수 있습니다
var form = new SomeForm();
var src = new SomeDataSource();
// ...
src.OnFrameworkEvent += form.SomeAction;
form.Closing += (sender, eargs) => src.OnFrameworkEvent -= form.SomeAction;
이제 이 스레드 접근 방식입니까? 양식이 닫히는 중이고 외부 스레드가
BeginInvoke
을 호출하는 경우 양식을 닫으면 호출이 실행 대기 상태로 유지됩니까? (이는 여전히 동일한 문제가 발생할 가능성이 있음을 의미 함)크로스 스레드 이벤트 처리에 더 나은 접근법이나 권장 패턴이 있습니까?
나는이 접근법을 좋아한다. 나는 스레드가 완료되었을 때 시그널링을 위해 콜백 메소드를 사용하는 것을 좋아한다. –