C# 如何为列表中的每个项目运行Task.whalll方法并存储结果?
我正在开发一个应用程序,它每隔几分钟检索一次RSS提要,并下载提要上与一组标准匹配的项目。然而,我正在努力调试下面的代码。当我在代码中设置断点时,它不会超过C# 如何为列表中的每个项目运行Task.whalll方法并存储结果?,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,我正在开发一个应用程序,它每隔几分钟检索一次RSS提要,并下载提要上与一组标准匹配的项目。然而,我正在努力调试下面的代码。当我在代码中设置断点时,它不会超过GoThroughFeeds()中的第一行。我怀疑我创建和处理任务的方式有问题。最初,我使用Task.Run()创建任务,但它们会运行两次(等待后的第二批)。我做错了什么 private async void RunOnInterval(TimeSpan delay) { do { await GoThroughFeeds()
GoThroughFeeds()
中的第一行。我怀疑我创建和处理任务的方式有问题。最初,我使用Task.Run()
创建任务,但它们会运行两次(等待后的第二批)。我做错了什么
private async void RunOnInterval(TimeSpan delay)
{
do
{
await GoThroughFeeds();
await Task.Delay(delay);
} while (true);
}
private async Task GoThroughFeeds()
{
Feed[] updatedFeeds = await Task
.WhenAll(Repository.Data.Feeds.Select(feed => new Task<Feed>(() => FetchRss(feed))));
// Do more stuff with the feeds
}
public Feed FetchRss(Feed feed)
{
feed.Items = Repository.GetItems(feed);
return feed;
}
private async void RunOnInterval(时间跨度延迟)
{
做
{
等待通关();
等待任务。延迟(延迟);
}虽然(正确);
}
私有异步任务GoThroughFeeds()
{
提要[]updatedFeeds=等待任务
.WhenAll(Repository.Data.feed.Select(feed=>newtask(()=>FetchRss(feed)));
//用feed做更多的事情
}
公共提要获取RSS(提要)
{
feed.Items=Repository.GetItems(feed);
回馈;
}
新任务(()=>FetchRss(提要))
错误。您正在尝试等待尚未启动的任务。事实上,几乎不应该使用Task的构造函数
Task.FromResult
也不好,因为它会同步执行代码,而不是将代码卸载到其他线程
最后,Task.Run
会完全满足您的需要。新任务(()=>FetchRss(feed))
是错误的。您正在尝试等待尚未启动的任务。事实上,几乎不应该使用Task的构造函数
Task.FromResult
也不好,因为它会同步执行代码,而不是将代码卸载到其他线程
最后,
Task.Run
完全满足您的需要。新任务(()=>FetchRss(feed))
肯定是错误的。你在等待一个从未开始的任务。我真的不明白你为什么在任务上遇到麻烦。当我从新任务(()=>FetchRss(feed))
更改为任务时,运行。从结果(FetchRss(feed))
,它开始工作Task.Run()
在这种情况下不起作用,因为我需要返回值,它只需要执行操作。之前我的代码可能还有其他问题,这让我相信我需要使用
newtask`而不是Task
上的静态方法,因为我认为它们会立即运行。Task.FromResult
将同步执行函数,所以这不是您想要的。您可以使用任务。使用函数运行:您是对的。当我使用Task.Run时,更新速度要快得多。如果你想把它写下来作为答案,我接受。newtask(()=>FetchRss(feed))
肯定是错误的。你在等待一个从未开始的任务。我真的不明白你为什么在任务上遇到麻烦。当我从新任务(()=>FetchRss(feed))
更改为任务时,运行。从结果(FetchRss(feed))
,它开始工作Task.Run()
在这种情况下不起作用,因为我需要返回值,它只需要执行操作。之前我的代码可能还有其他问题,这让我相信我需要使用
newtask`而不是Task
上的静态方法,因为我认为它们会立即运行。Task.FromResult
将同步执行函数,所以这不是您想要的。您可以使用任务。使用函数运行:您是对的。当我使用Task.Run时,更新速度要快得多。如果你想写下来作为回答,我会接受的。