我需要一个返回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));
}
Run Code Online (Sandbox Code Playgroud)
这个片段编译,但当我称之为
Task<string> dlTask = AsyncTest();
Workdl(await dlTask);
await Task.WhenAll(dlTask); //Task never completes
Run Code Online (Sandbox Code Playgroud)
它永远不会决定.
ang*_*son 29
除非您正在编写自己的任务管理系统,否则您可能永远不会使用new Task(...).
但是,除此之外,这种情况在这种情况下不起作用的原因是因为a new Task(...)本身并不起作用.它只是围绕代理构造任务对象.
您应该明确地启动它:
var t = new Task(() => string.Empty);
t.Start();
return t;
Run Code Online (Sandbox Code Playgroud)
或者简单地使用Task.Run:
return Task.Run(() => string.Empty);
Run Code Online (Sandbox Code Playgroud)
(这是我建议避免使用new Task(...))
现在,在这种情况下,我会完全不同的东西.
如果您实际上不需要运行任务,则可以围绕现有结果创建已完成的任务.我说"如果"的原因是你的问题中的例子可能因为这个问题而被愚蠢,你可能实际上有代码,在这种情况下你应该去看看这段代码.但是,如果您需要遵循异步方法签名返回任务但实际上不需要启动任务,那么执行以下操作:
return Task.FromResult(string.Empty);
Run Code Online (Sandbox Code Playgroud)
这简单地"开始已经完成".
Sco*_*ham 15
你可以使用Task.FromResult()
return Task.FromResult(string.Empty);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20385 次 |
| 最近记录: |