2010-10-28 11 views
9

Vorrei utilizzare il framework Task in .NET per pianificare un'operazione da eseguire su un thread diverso, quindi una volta terminato con un'operazione per aggiornare l'interfaccia utente sul thread dell'interfaccia utente. (Non ho giocato con esso ancora molto, quindi non è molto familiare per me.)C# Task.ContinueWith problemi

Ecco il codice:

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

Impossibile convertire implicitamente il tipo 'System.Threading.Tasks.Task' a 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. Una conversione esplicita esiste

ho pensato che se uso la firma generica di Lista <NewsItem> sul compito che la Task.Result sarebbe tornato quel tipo così ho potuto passarlo al mio metodo ... cosa sto facendo sbagliato qui?

+0

async/await può risolvere facilmente questo problema. –

+0

Sì, non era fuori quando ho scritto questo. – Kelly

risposta

11

Il problema è che, poiché il vostro lambda è un Action<Task>, ContinueWith restituisce un Task, e si stanno assegnando che a fetchTask, che è di tipo Task<List<NewsItem>>. Si noti che si sta assegnando il risultato della chiamata ContinueWith alla variabile, non il risultato della chiamata new Task<>.

Se si fa qualcosa di simile:

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

si noterà che c'è un problema becuase tua lambda restituisce void, ma il compito si aspetta un ritorno di List<NewsItem>. Quindi probabilmente vorrai restituirlo dai tuoi UpdateNewsItems, oppure creare l'attività e aggiungere la continuazione in seguito.

Problemi correlati