我需要一个返回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
它永远不会决定。
答案 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);