方法返回的任务
问题描述:
我需要用空字符串返回一个Task<string>
像方法返回的任务<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
它从来没有决定。
答
除非您正在编写自己的任务管理系统,否则您应该永远不要使用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);
这只是“开出已经完成”。