C# Task.ContinueWith 问题

发布于 2024-09-29 04:09:51 字数 792 浏览 0 评论 0 原文

我想使用 .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)
{
...
}

Cannot 隐式地​​将类型 'System.Threading.Tasks.Task' 转换为 'System.Threading.Tasks.Task>'。存在显式转换

我认为如果我使用 List 的通用签名关于 Task.Result 将返回该类型的任务,以便我可以将其传递给我的方法...... 我在这里做错了什么?

I would like to use the Task framework in .NET to schedule something to run on a different thread then when it's done continue with an operation to update the UI on the UI thread. (I haven't played with it much yet, so it's not very familiar to me.)

Here is the code:

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

Cannot implicitly convert type 'System.Threading.Tasks.Task' to 'System.Threading.Tasks.Task<System.Collections.Generic.List<Spark.Models.NewsItem>>'. An explicit conversion exists

I thought that if I use the generic signature of List<NewsItem> on the task that the Task.Result would return that type so I could pass it to my method...
What am I doing wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

停顿的约定 2024-10-06 04:09:51

问题是,由于您的 lambda 是一个 Action,ContinueWith 返回一个 Task,并且您将其分配给 fetchTask,即类型为Task>。请注意,您将 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。因此,您可能想要从 UpdateNewsItems 返回该任务,或者创建任务并稍后添加延续。

The issue is that since your lambda is an Action<Task>, ContinueWith returns a Task, and you are assigning that to fetchTask, which is of type Task<List<NewsItem>>. Note that you are assigning the result of the ContinueWith call to the variable, not the result of the new Task<> call.

If you do something like this:

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

you will notice that there's a problem becuase your lambda returns void, but the task expects a return of List<NewsItem>. So you probably want to either return that from your UpdateNewsItems, or create the task and add the continuation later.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文