본문 바로가기
💻IT

C# UI 컴포넌트 다른 쓰레드에서 업데이트 방법 (ObeservableCollection)

by Lunethan 2022. 6. 3.

C# UI의 ObservableCollection을 다른 쓰레드에서 업데이트 하려면 UI Thread가 아니기 때문에 에러가 발생한다. 주로 발생하는 상황은 Task를 생성해서 UI가 멈추지 않도록 작업을 해야하는데, 이 생성한 Task에서 UI를 업데이트 해줘야 하는 경우이다.

해결방법

BindingOperations.EnableCollectionSynchronization 활용

C# 4.5에 추가된 이 기능은 멀티쓰레드 환경에서 ObjectCollections을 업데이트 해줄 때 활성화해주면 UI 쓰레드가 아니더라도 ObjectCollection을 업데이트 해줄 수 있다.

 

더 자세한 내용은 아래 마이크로소프트 문서를 참조하면 된다.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.data.bindingoperations.enablecollectionsynchronization?view=windowsdesktop-6.0

예시 코드

출처: 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을 해줘야 한다. 그래야 다른 쓰레드에서 접근하는 경우 (쓰레드 충돌)를 방지할 수 있다. 

 

댓글