저는 현재 백그라운드 스레드에서 오는 winforms 데이터 바인딩 및 업데이트를 많이 사용하는 응용 프로그램의 데이터 바인딩 부분을 설계/재 작업하고 있습니다 (한 번에 100 개가 넘는 레코드).WinForms 멀티 스레드 데이터 바인딩 시나리오, 모범 사례?
응용 프로그램이 주식 거래 응용 프로그램이라고 가정 해 보겠습니다. 백그라운드 스레드가 데이터 변경 사항을 모니터링하고이를 데이터 개체에 저장합니다. 이러한 개체는 BindingList<>
에 저장되고 INotifyPropertyChanged
을 구현하여 데이터 바인딩을 통해 변경 내용을 winforms 컨트롤에 전파합니다. 또한 데이터 개체는 현재 WinformsSynchronizationContext.Send
을 통해 변경 내용을 UI 스레드에 마샬링하고 있습니다. 사용자가 UI에 일부 값을 입력 할 수 있습니다. 즉, 일부 값을 양쪽에서 변경할 수 있습니다. 사용자 값은 업데이트로 인해 겹쳐서는 안됩니다.
- (바인딩에 배경 업데이트) 그렇게하는 방법을 일반적인 디자인 guildline이 있습니까?
- UI 스레드에서 마샬링하는시기 및 방법은 무엇입니까?
- 바인딩/데이터 개체와 상호 작용하는 배경 스레드의 가장 좋은 방법은 무엇입니까?
- 어떤 클래스/인터페이스를 사용해야합니까? (BindingSource에, ...)
- ...
UI를 정말 컨트롤을 업데이트하는 백그라운드 스레드가 발생한 것을 알고하지 않는 나의 이해의 같은 데이터 바인딩 시나리오는 UI shouldn에 ' 데이터가 어디에서 오는지 알 수 있습니다 ... 배경 스레드가 UI에 데이터를 푸시하는 것으로 생각할 수 있습니다. 따라서 백그라운드 워커가 내가 찾는 옵션인지 확실하지 않습니다.
경우에 따라 데이터/비즈니스 개체에서 작업하는 동안 (예 : 다시 계산 중 배경 설정) UI 응답을 받고 싶을 때가 있습니다. 배경에 바인딩 된 상태 속성에 대한 속성 변경은 충분하지 않습니다. 계산이 완료된 후 컨트롤이 다시 그려지기 때문입니다. 내 생각은 propertychanged 이벤트에 연결하고 .update() 컨트롤을 호출하는 것입니다 ... 그것에 대해 다른 아이디어?
System.ComponentModel.BackgroundWorker 그러나 어려운 문제는 데이터가 UI 스레드를 보지 않고 빠르게 업데이트 유지하는 방법이며, 해결책의 일부가 될 수 있습니다. 위의 작업을 수행 할 때마다 코드 행마다 스레드 호출을 잠 그거나 교차하는 것을 생각하지 않아도됩니다. –
Backgroundworker를 보면 스레드를 생성하고 WindowsFormsSynchronizationContext로 마샬링하는 것과 큰 차이가 없으며 BW도 마찬가지입니다. –
편집을 참조하십시오. – Dun3