返回Task<string>的方法

25

我需要一个返回空字符串的 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个回答

53

除非你正在编写自己的任务管理系统,否则最好不要使用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);

这只是“已经完成了”的简单开头。

我认为应该是返回 await Task.FromResult("some string"); - Daniel Jerome
如果这段代码在异步方法中,那么简单的 return "some string"; 就足够了。 - Lasse V. Karlsen

29

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接