0
私は数分おきにRSSフィードを取得し、一連の基準に一致するフィードにアイテムをダウンロードするアプリケーションに取り組んでいます。しかし、私は下のコードをデバッグするのに苦労しています。私のコードでブレークポイントを設定すると、それはGoThroughFeeds()
の最初の行を過ぎていません。私は、タスクを作成して処理する方法に何か問題があると考えています。最初はTask.Run()
を使用してタスクを作成しましたが、それらは2回実行されます(待ってから2番目のバッチ)。私は間違って何をしていますか?リスト内のすべての項目に対してTask.WhenAllを使用してメソッドを実行し、結果を保存する方法は?
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;
}
'新しいタスク(()=> FetchRss(feed))'が間違っています。決して開始されないタスクを待っています。なぜあなたは 'Task.Run'に問題があったのか分かりません –
'新しいタスク(()=> FetchRss(フィード))) 'から' Task.FromResult(FetchRss(feed)) 'に変更したとき、仕事を始めました。 'Task.Run()'はこのシナリオでは動作しません。なぜなら、戻り値が必要で、 'Action 'しか必要ないからです。先ほどのコードでは何か間違っていたかもしれませんが、 'Task'の静的メソッドの代わりに' new Task'を使う必要があると私は思っていました。 – Expotr
'Task.FromResult'は関数を同期的に実行するので、それはあなたが望むものではありません。あなたは 'Func'で' Task.Run'を使うことができます:https://msdn.microsoft.com/en-us/library/hh160382(v=vs.110).aspx –