2016-12-04 1 views
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; 
} 
+1

'新しいタスク(()=> FetchRss(feed))'が間違っています。決して開始されないタスクを待っています。なぜあなたは 'Task.Run'に問題があったのか分かりません –

+0

'新しいタスク(()=> FetchRss(フィード))) 'から' Task.FromResult(FetchRss(feed)) 'に変更したとき、仕事を始めました。 'Task.Run()'はこのシナリオでは動作しません。なぜなら、戻り値が必要で、 'Action 'しか必要ないからです。先ほどのコードでは何か間違っていたかもしれませんが、 'Task'の静的メソッドの代わりに' new Task'を使う必要があると私は思っていました。 – Expotr

+0

'Task.FromResult'は関数を同期的に実行するので、それはあなたが望むものではありません。あなたは 'Func'で' Task.Run'を使うことができます:https://msdn.microsoft.com/en-us/library/hh160382(v=vs.110).aspx –

答えて

2

new Task<Feed>(() => FetchRss(feed))が間違っています。あなたは、開始されていないタスクを待つことを試みています。実際、Taskのコンストラクタはほとんど使用されるべきではありません。

は、別のスレッドにオフロードするのではなく、コードを同期して実行するので、どちらかといえば良くありません。

最後に、Task.Runは必要なものを正確に行います。

関連する問題