2016-07-21 3 views
0

내 문제는 내 작업이 UI 요소에 데이터 바인딩 된 관찰 가능 컬렉션을 변경하고 있다는 것입니다. 내 작업 진행 상황을보고하고,이 데이터는 observable collection를 통해 UI 업데이트됩니다 :이 코드를 실행하면 내가이 오류를 얻을비동기 ObservableCollection을 진행 상태로 업데이트

async private void getProductData() 
{ 
    await Task.Run(() => getTableDataFromDb(new Progress<string>(
     data => _prc.Add(new ProductList() { Taxe = data }) 
     ), "List")); 
} 
private void getTableDataFromDb(IProgress<string> progress, string tabelName) 
{ 
    //simple exemple 
    for(var i =0; i < 100; i++) 
    progress.Report("test"+i); 
} 

: 내가 메인 스레드에 액세스 할 수있는 방법을

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

을 이 컬렉션을 업데이트 하시겠습니까? 감사합니다.

+2

http://stackoverflow.com/questions/2091988/how-do-i-update-an-observablecollection-via-a-worker-thread –

+0

내 앱이 backgroundworker가 아닌 async-await을 사용하고 있습니다. 감사합니다. –

+0

동일합니다. 배경 스레드에서 문제 ... 컬렉션이 변경되었습니다. –

답변

2

문제는 잘못된 스레드에 Progress<string> 개체를 생성하고 있다는 것입니다. 실제로 작업을 수행하는 동일한 작업자 스레드에서 생성됩니다. 즉, 올바른 스레드를 다시 마샬링하여 올바른 SynchronizationContext 개체를 캡처하지 못합니다.

async private void getProductData() 
{ 
    IProgress<string> progress = new Progress<string>(
     data => _prc.Add(new ProductList() { Taxe = data })); 

    await Task.Run(() => getTableDataFromDb(progress, "List")); 
} 

아마도 당신의 UI 스레드입니다 getProductData()를 호출하는 스레드에 Progress<string> 객체를 생성합니다 :

대신, 당신은 이런 식으로 뭔가를 할 수 있습니다. 그런 다음 IProgress<string>.Report() 메서드가 호출되면 대리자 호출이 의도 한대로 UI 스레드로 마샬링됩니다.

+0

은 저에게 큰 도움을줍니다. 감사합니다. –

관련 문제