C # Task.Continue с проблемами - PullRequest
       3

C # Task.Continue с проблемами

9 голосов
/ 28 октября 2010

Я хотел бы использовать каркас задач в .NET, чтобы запланировать выполнение чего-либо в другом потоке, а затем по завершении продолжить операцию по обновлению пользовательского интерфейса в потоке пользовательского интерфейса.(Я с ним еще немного не играл, поэтому он мне не очень знаком.)

Вот код:

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

Не удается неявно преобразовать тип 'System.Threading.Tasks.Task 'to' System.Threading.Tasks.Task>».Существует явное преобразование

. Я подумал, что если я использую общую подпись List в задаче, то Task.Result вернет этот тип, чтобы я мог передать его своему методу ... Что яздесь делаешь неправильно?

1 Ответ

11 голосов
/ 28 октября 2010

Проблема в том, что поскольку ваша лямбда является Action<Task>, ContinueWith возвращает Task, и вы присваиваете ее fetchTask, который имеет тип Task<List<NewsItem>>. Обратите внимание: вы присваиваете переменную результат вызова 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);

вы заметите, что есть проблема, потому что ваша лямбда возвращает void, но задача ожидает возврата List<NewsItem>. Так что вы, вероятно, захотите либо вернуть это из ваших UpdateNewsItems, либо создать задачу и добавить продолжение позже.

...