2010-10-28 36 views
9

Farklı bir iş parçacığında çalışacak bir şey zamanlamak için .NET'teki Görev çerçevesini kullanmak isterim. İşlem bittiğinde, kullanıcı arabirimindeki kullanıcı arabirimini güncelleştirmek için bir işlemle devam edin. (Ben çok henüz onunla oynamadım, bu yüzden bana çok tanıdık değil.) Burada C# Task.ContinueWith ile ilgili sorunlar

kodudur:

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) 
{ 
... 
} 

örtülü dönüştürülemez tipi 'System.Threading.Tasks.Task' için 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. Açık dönüştürme

Ben görev listesi <NewsItem> jenerik imza kullanmak eğer benim yöntemine geçmek böylece Task.Result ... Ben ne yapıyorum bu tür iade edeceğini düşündük var burada yanlış mı?

+0

async/await bu sorunu kolayca çözebilir. –

+0

Evet, bunu yazdığım zaman dışarı çıkmadı. – Kelly

cevap

11

sorunun lamda bir Action<Task> olduğundan, ContinueWith bir Task döndürür ve tip Task<List<NewsItem>> taşımaktadır fetchTask, bu atama olmasıdır. new Task<> numaralı aramanın sonucunu değil, ContinueWith aramasının değişkeni aramayı atadığınızı unutmayın.

böyle bir şey yaparsanız:

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); 

sizin lambda geçersiz döndürür, ancak görev List<NewsItem> getiri beklediği çünkü bir sorun olduğunu fark edecektir. Yani muhtemelen bunu UpdateNewsItems'inizden döndürmek veya görevi oluşturmak ve daha sonra devam ettirmek istersiniz.