2012-11-23 2 views
0

저는 Silverlight보기에서 TabControl을 사용하고 있으며 ItemsSource를 내 ViewModel의 TabItems ObservableCollection에 바인딩하여 탭을로드하고 있습니다.Silverlight의 BackgroundWorker ViewModel

새 탭을 열려면 탭을 만들고로드하고 잠시 BusyIndicator를 실행하고 싶습니다.

ViewModel에서 생성되어로드되기 때문에 "로드"메서드를 호출하기 전에 IsBusy 속성을 설정하면 비동기 적이기 때문에 표시되지 않습니다.

backgroundworker에서 설정하려고했지만 TabItem을 만들어 TabItems 목록 (UnauthorizedAccessException)에 추가 할 때 충돌이 발생합니다.

어떤 아이디어 ??? 미리 감사드립니다.

+0

BGW 코드를 게시 할 수 있습니까? –

답변

2

는 작업 (AsyncCtp with Silverlight 4) 사용 : 새 비동기를 사용할 수 있다면 더 나은 얻을

public void Load(){ 
    this.IsBusy = true; 
    Task.Factory.StartNew(()=> DoHeavyWork()) 
     .ContinueWith(t => this.IsBusy = false); 
} 

은/비동기 CTP 또는 VS2012/Silverlight 5

public async void Load(){ 
    try{ 
     this.IsBusy = true; 

     await Task.Factory.StartNew(()=> DoHeavyWork()); 
    } 
    finally 
    {  
     this.IsBusy = false; 
    } 
} 

편집

와 기능을 기다리고 있습니다

백그라운드 작업에서 ObservableCollection을 업데이트한다고 가정합니다. 콜렉션 업데이트를 처리하는 핸들러가 UI 스레드에서 실행되지 않기 때문에 실제로 문제가 발생할 수 있습니다. 따라서 콜렉션 업데이트는 바인딩 시스템만큼 스레드 안전하지 않습니다. 이 작업을 수행하려면 UI 스레드의 ObservableCollection에 항목을 추가해야합니다. 당신이 한 번에 모든 아이템을 취득 할 수있는 경우, 당신은이 작업을 수행 할 수 있습니다 내가 this answer에서 제안처럼

public async void Load(){ 
    try{ 
     this.IsBusy = true; 

     // Returns the fetched items 
     var items = await Task.Factory.StartNew(()=> DoHeavyWork()); 

     // This will happen in the UI thread because "await" returns the 
     // control to the original SynchronizationContext 
     foreach(var item in items) 
      this.observableCollection.Add(item); 
    } 
    finally 
    {  
     this.IsBusy = false; 
    } 
} 

당신이 일괄 적으로로드 할 수있는 경우

, 당신은, 현재 Dispatcher를 사용하여 컬렉션에 항목을 추가 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 비동기 솔루션을 시도했지만 새 컨트롤을 만들 때 여전히 UnauthorizedAccessException이 발생합니다 .- ( – zapico

+0

UI 스레드가 아닌 스레드에서 탭 컨트롤에 대한 항목을 생성하는 ObservableCollection을 업데이트하면 참으로 당신 문제. 편집 된 답변보기 –

+0

깊은 설명 주셔서 감사합니다 :) – zapico

0

이것은 UI의 요소 또는 UI를 반영하는 데이터를 변경하는 컬렉션에 액세스하려고 할 때 발생합니다. 실제로 이것은 크로스 스레드 예외입니다. 백그라운드 작업자를 만들면 기본적으로 다른 스레드가 생성됩니다. 따라서 백그라운드 작업자의 기본 UI 스레드 변수에 액세스 할 수 없습니다.

+0

이제 우리는 그 이유를 알고, 당신은 어떤 해결책을 알고 있습니까 ?? – zapico