2016-12-04 1 views
0

나는 몇 분마다 RSS 피드를 검색하고 일련의 기준과 일치하는 피드에 항목을 다운로드하는 응용 프로그램을 만들고 있습니다. 그러나 아래 코드를 디버깅하는 데 어려움을 겪고 있습니다. 내 코드에서 중단 점을 설정할 때 GoThroughFeeds()의 첫 번째 줄을 지나치지 않습니다. 작업을 만들고 처리하는 방식에 문제가 있다고 생각합니다. 처음에는 Task.Run()을 사용하여 작업을 만들었지 만 두 번 실행됩니다 (대기 후 두 번째 배치). 내가 도대체 ​​뭘 잘못하고있는 겁니까?목록의 모든 항목에 대해 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

''Task (FetchRss (feed) 일하기 시작했다. 'Task.Run()'은 반환 값이 필요하고'Action 만 필요하기 때문에이 시나리오에서는 작동하지 않습니다. 이전에 내 코드에 뭔가 다른 것이 있었기 때문에,'Task'에 정적 메서드 대신'새 작업 '을 사용해야한다고 생각했습니다. 왜냐하면 즉시 실행될 것이라고 생각했기 때문입니다. – Expotr

+0

'Task.FromResult'는 함수를 동 기적으로 실행할 것이므로 원하는 것은 아닙니다. 'Task.Run'을'Func'과 함께 사용할 수 있습니다 : https://msdn.microsoft.com/en-us/library/hh160382(v=vs.110).aspx –

답변

2

new Task<Feed>(() => FetchRss(feed))이 잘못되었습니다. 시작되지 않은 작업을 기다리는 중입니다. 사실 Task 생성자는 거의 사용되지 않아야합니다.

은 코드를 동기식으로 실행하기 때문에 코드를 다른 스레드로 오프로드하는 대신 좋지 않습니다.

결국 Task.Run은 정확히 필요한 것을 수행합니다.