返回Task <string>的方法

时间:2016-09-16 07:26:43

标签: c# task

我需要一个返回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 

它永远不会决定。

2 个答案:

答案 0 :(得分:23)

除非您正在编写自己的任务管理系统,否则您可能永远不会使用new Task(...)

然而,除此之外,在这种情况下这不起作用的原因是因为new Task(...)并不是自己开始的。它只是围绕代理构建任务对象。

您应该明确地启动它:

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

或者只需使用Task.Run代替:

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

(这是我建议避免使用new Task(...)

现在,在这种情况下,我会选择完全不同的东西。

如果您实际上不需要运行任务,则只需围绕现有结果创建已完成的任务即可。我说&#34;如果&#34;是你的问题中的例子可能会因为这个问题而愚蠢,你可能实际上有代码,在这种情况下你应该去看看这段代码。但是,如果您需要遵循返回任务的异步方法签名但实际上不需要启动任务,那么请执行以下操作:

return Task.FromResult(string.Empty);

这只是#34;开始已经完成&#34;。

答案 1 :(得分:12)

您可以使用Task.FromResult()

return Task.FromResult(string.Empty);