2016-09-16 2 views
4

Мне нужен метод, который возвращает Task<string> с пустой строкой, какметод, который возвращает Task <string>

public static Task<string> AsyncTest() 
{  
    return new Task<string>(() => string.Empty); //problem here 

    // this method would work: 
    // return new WebClient().DownloadStringTaskAsync(@"http://www.google.de"); 
} 

public static void Workdl(string input) 
{ 
    Console.Write("OUT: " + input.Substring(0, 100)); 
} 

Этот фрагмент кода компилирует, но когда я называю это как

Task<string> dlTask = AsyncTest(); 
Workdl(await dlTask); 
await Task.WhenAll(dlTask); //Task never completes 

он никогда не определяет.

ответ

14

Если вы не пишете собственную систему управления задачами, вы, вероятно, никогда не должны использовать new Task(...).

Однако, в этом случае причина в том, что это не работает в этом случае, потому что new Task(...) не запускается сам по себе. Он просто создает объект задачи вокруг вашего делегата.

Вы должны либо явным образом запустить его:

var t = new Task(() => string.Empty); 
t.Start(); 
return t; 

Или просто использовать Task.Run вместо:

return Task.Run(() => string.Empty); 

(это будет моя рекомендация, чтобы избежать использования new Task(...))

Теперь, в этом случае я бы пошел на что-то совсем другое.

Если вам действительно не нужно запустите задачу, вы можете просто создать уже выполненную задачу вокруг существующего результата. Причина, по которой я говорю «если», заключается в том, что ваш пример в вопросе может быть подавлен ради этого вопроса, и на самом деле у вас может быть код, и в этом случае вам следует перейти на код выше этого абзаца. Тем не менее, если вам нужно придерживаться к методу асинхронной подписи, возвращающой задачу, но на самом деле не нужно раскручивать задачу, то сделать это:

return Task.FromResult(string.Empty); 

Это просто «начинается уже завершено».

Смежные вопросы