2010-10-28 21 views
9

me gustaría utilizar el marco de tareas en .NET para programar algo para ejecutarse en un subproceso diferente a continuación, cuando se hace continuar con una operación para actualizar la interfaz de usuario en el subproceso de interfaz de usuario. (No he jugado con él mucho todavía, así que no es muy familiar para mí.)C# Task.ContinueWith emite

Aquí está el código:

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

No se puede convertir implícitamente el tipo 'System.Threading.Tasks.Task' a 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. existe una conversión explícita

pensé que si uso la firma genérica de Lista < elemento Novedades > en la tarea que el Task.Result regresaría ese tipo para que pudiera pasar a mi método ... qué estoy haciendo mal aquí?

+0

asíncrono/aguardan puede resolver este problema fácilmente. –

+0

Sí, no estaba fuera cuando escribí esto. – Kelly

Respuesta

11

La cuestión es que desde su lambda es un Action<Task>, ContinueWith devuelve un Task, y que está asignando a fetchTask, que es de tipo Task<List<NewsItem>>. Tenga en cuenta que está asignando el resultado de la ContinueWith llamada a la variable, no el resultado de la llamada new Task<>.

Si haces algo como esto:

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

se dará cuenta de que hay un problema becuase su lambda devuelve void, pero la tarea espera un retorno de List<NewsItem>. Por lo tanto, probablemente desee devolverlo desde UpdateNewsItems o crear la tarea y agregar la continuación más adelante.

Cuestiones relacionadas