C# UI의 ObservableCollection을 다른 쓰레드에서 업데이트 하려면 UI Thread가 아니기 때문에 에러가 발생한다. 주로 발생하는 상황은 Task를 생성해서 UI가 멈추지 않도록 작업을 해야하는데, 이 생성한 Task에서 UI를 업데이트 해줘야 하는 경우이다.
해결방법
BindingOperations.EnableCollectionSynchronization 활용
C# 4.5에 추가된 이 기능은 멀티쓰레드 환경에서 ObjectCollections을 업데이트 해줄 때 활성화해주면 UI 쓰레드가 아니더라도 ObjectCollection을 업데이트 해줄 수 있다.
더 자세한 내용은 아래 마이크로소프트 문서를 참조하면 된다.
예시 코드
출처: https://stackoverflow.com/questions/21720638/using-bindingoperations-enablecollectionsynchronization
_itemsLock = new object();
Items = new ObservableCollection<Item>();
BindingOperations.EnableCollectionSynchronization(Items, _itemsLock);
ObjectCollection객체를 생성해주고, EnableCollectionSynchronization을 실행해준다. 나는 ObjectCollection은 프로퍼티로 만들고 생성자에서 Sync를 해주었다.
lock (_itemsLock)
{
// Once locked, you can manipulate the collection safely from another thread
Items.Add(new Item());
Items.RemoveAt(0);
}
ObjectCollection 객체를 수정할 때 반드시 lock을 해줘야 한다. 그래야 다른 쓰레드에서 접근하는 경우 (쓰레드 충돌)를 방지할 수 있다.
'💻IT' 카테고리의 다른 글
TV 고장 증상 수리 방법 깜빡임 전원 불량 및 액정 화소 불량 (0) | 2022.06.26 |
---|---|
삼성 LG 티비 A/S 신청 접수 방법 및 걸리는 시간, 출장 비용 (0) | 2022.06.06 |
LG, 삼성 티비 전원, 화면 안켜질때 간편 수리 방법 3가지 (0) | 2021.12.04 |
머신러닝 랜덤포레스트 하이퍼 파라미터 자동 튜닝 방법 (0) | 2021.11.20 |
근로장려금 8월 지급일 지급 액수 알아보자 (0) | 2021.07.23 |
댓글