代码之家  ›  专栏  ›  技术社区  ›  Kelly

C#任务。继续处理问题

  •  9
  • Kelly  · 技术社区  · 14 年前

    我想使用.NET中的任务框架来安排在不同线程上运行的内容,然后当它完成时,继续执行更新UI线程上的UI的操作。(我还没怎么玩过,所以对我来说不是很熟悉。)

    代码如下:

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

    我想,如果在任务上使用List<NewsItem>的泛型签名,则task.Result将返回该类型,以便将其传递给我的方法。。。

    1 回复  |  直到 14 年前
        1
  •  11
  •   Manuel    14 年前

    问题是既然你的lambda是 Action<Task> ,ContinueWith返回 Task fetchTask ,类型为 Task<List<NewsItem>> ContinueWith 调用变量,而不是 new Task<>

    如果你这样做:

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

    您会注意到有一个问题,因为您的lambda返回void,但是任务期望返回 List<NewsItem> . 因此,您可能希望从UpdateNewsItems返回该值,或者创建任务并在稍后添加continuation。

    推荐文章