C# 返回任务的方法<;字符串>;

C# 返回任务的方法<;字符串>;,c#,task,C#,Task,我需要一个返回带有空字符串的任务的方法,如 public static Task<string> AsyncTest() { return new Task<string>(() => string.Empty); //problem here // this method would work: // return new WebClient().DownloadStringTaskAsync(@"http://www.go

我需要一个返回带有空字符串的
任务的方法,如

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));
}
公共静态任务AsyncTest()
{    
返回新任务(()=>string.Empty);//这里有问题
//这种方法可以:
//返回新的WebClient().DownloadStringTaskAsync(@)http://www.google.de");   
}
公共静态void Workdl(字符串输入)
{
Console.Write(“OUT:”+input.Substring(01000));
}
这段代码可以编译,但当我像

Task<string> dlTask = AsyncTest();
Workdl(await dlTask);
await Task.WhenAll(dlTask); //Task never completes 
Task dlTask=AsyncTest();
Workdl(等待dlTask);
等待任务。WhenAll(dlTask)//任务永远不会完成

它永远不会决定。

除非您正在编写自己的任务管理系统,否则您可能永远不应该使用
新任务(…)

然而,撇开这一点不谈,在这种情况下这种方法不起作用的原因是,
新任务(…)
不能自行启动。它只是围绕代理构造任务对象

您应该明确地启动它:

var t = new Task(() => string.Empty);
t.Start();
return t;
或者简单地使用
任务。改为运行

return Task.Run(() => string.Empty);
(我建议避免使用
新任务(…)

现在,在这种情况下,我会选择完全不同的东西

如果您实际上不需要运行任务,只需围绕现有结果创建一个已完成的任务即可。我说“如果”的原因是,为了这个问题,你在问题中的例子可能会被简化,你可能实际上有代码在里面,在这种情况下,你应该使用本段上面的代码。但是,如果您需要遵守返回任务的异步方法签名,但实际上不需要启动任务,请执行以下操作:

return Task.FromResult(string.Empty);
这只是“开始时已经完成”。

您可以使用


我相信它实际上应该是return-await任务@DanielJerome如果代码的方法是
async
,那么只需
返回“some string”就足够了。
return Task.FromResult(string.Empty);