方法返回的任务

问题描述:

我需要用空字符串返回一个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); 

这只是“开出已经完成”。

您可以使用Task.FromResult()

return Task.FromResult(string.Empty);