2010-10-28 32 views
9

Tôi muốn sử dụng khung Nhiệm vụ trong .NET để lên lịch để chạy trên một chuỗi khác nhau khi nó được thực hiện tiếp tục với một thao tác để cập nhật giao diện người dùng trên chuỗi giao diện người dùng. (Tôi đã không chơi với nó nhiều, vì vậy nó không phải rất quen thuộc với tôi.)C# Task.ContinueVới các vấn đề

Đây là mã:

Task<List<NewsItem>> fetchTask = new Task<List<NewsItem>>(() => 
     { 
      List<NewsItem> items = Rss.FetchNewsItems(feed); 
      return items; 
     }).ContinueWith(x => UpdateNewsItems(x.Result),CancellationToken.None,TaskContinuationOptions.None,scheduler); 


private void UpdateNewsItems(List<NewsItem> items) 
{ 
... 
} 

Không thể ngầm chuyển đổi loại 'System.Threading.Tasks.Task' để 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. Một chuyển đổi rõ ràng tồn tại

Tôi nghĩ rằng nếu tôi sử dụng chữ ký chung của Danh sách <NewsItem> trên nhiệm vụ Task.Result sẽ trả về loại đó để tôi có thể chuyển nó đến phương pháp của tôi ... Tôi đang làm gì sai ở đây?

+0

không đồng bộ/chờ đợi có thể giải quyết vấn đề này dễ dàng. –

+0

Vâng, không phải khi tôi viết bài này. – Kelly

Trả lời

11

Vấn đề là do lambda của bạn là Action<Task>, ContinueWith trả về một Task và bạn đang gán cho fetchTask, là loại Task<List<NewsItem>>. Lưu ý rằng bạn đang chỉ định kết quả của cuộc gọi ContinueWith tới biến, chứ không phải kết quả của cuộc gọi new Task<>.

Nếu bạn làm điều gì đó như thế này:

var fetchTask = 
     new Task<List<NewsItem>>(() => 
     { 
      List<NewsItem> items = Rss.FetchNewsItems(feed); 
      return items; 
     }) 
     .ContinueWith<List<NewsItem>>(
      x => UpdateNewsItems(x.Result), 
      CancellationToken.None, 
      TaskContinuationOptions.None,scheduler); 

bạn sẽ thấy rằng có một vấn đề bởi vì lambda của bạn trả về void, nhưng nhiệm vụ hy vọng sự trở lại của List<NewsItem>. Vì vậy, bạn có thể muốn trả về từ UpdateNewsItems của bạn, hoặc tạo nhiệm vụ và thêm phần tiếp theo sau.