2012-01-14 34 views
5

Trong một số lớp tôi muốn tải 2 bộ sưu tập đồng bộ với công tác và dừng busyindicatorTiếp tục công tác sau khi tất cả các nhiệm vụ hoàn thành

tôi cố gắng cái gì đó như thế này

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
WaitingIndicatorViewModel.IsBusy = true; 
var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService).ContinueWith(t => Data1Collection = t.Result, uiScheduler); 
var loadData2 = new Task<ObservableCollection<Data2>>(GetData2FromService).ContinueWith(t => Data2Collection = t.Result, uiScheduler); 

Task.Factory.StartNew(() =>{ 
       loadData1.Start();//<--Exception here   
       loadData2.Start(); 
       Task.WaitAll(loadData1, loadData2); 
     }) 
.ContinueWith(o => WaitingIndicatorViewModel.IsBusy = false, uiScheduler); 

Nhưng điều này ném một ngoại lệ InvalidOperationException:Start may not be called on a continuation task.

Tại sao điều này không làm việc, và làm thế nào tôi có thể chạy tiếp tục công việc sau khi hoàn thành cả hai nhiệm vụ, mà không chặn luồng hiện tại?

+0

Dòng nào ném ngoại lệ? –

+0

Các tác vụ tảiData1 và loadData2 có bất kỳ sự liên quan nào ở đây không? – Tudor

+0

xem bài đăng đã chỉnh sửa @ChrisShain –

Trả lời

15

Thay vì:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService) 
       .ContinueWith(t => Data1Collection = t.Result, uiScheduler); 

Tôi nghĩ rằng những gì bạn có nghĩa là:

var loadData1 = new Task<ObservableCollection<Data1>>(GetData1FromService); 
loadData1.ContinueWith(t => Data1Collection = t.Result, uiScheduler); 

Bây giờ bạn có thể (sau này) gọi:

loadData1.Start(); 

Sự khác biệt là chúng ta đang gán loadData1 đến ngoài cùng nhiệm vụ. Trong mã ban đầu của bạn, bạn đang chỉ định loadData1 kết quả của ContinueWith, là một thứ khác (nhiệm vụ thứ hai, để bạn có thể đợi hoặc tiếp tục từ nhiệm vụ giây thứ hai).

Lưu ý: nếu bạn muốn đợi nhiệm vụ bên trong, bạn nên nắm bắt kết quả cuộc gọi ContinueWith thành biến mới và đợi rằng.

+0

Ahh, cảm ơn Marc! bạn hoàn toàn đúng !! Tôi thay đổi cuộc gọi đến Task.Factory.Start bắt đầu nhiệm vụ đầu tiên tự động và nó hoạt động tuyệt vời –

Các vấn đề liên quan