gpt4 book ai didi

c# - 返回 Task 的方法

转载 作者:可可西里 更新时间:2023-11-01 08:30:55 29 4
gpt4 key购买 nike

我需要一个返回 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

它永远不会决定。

最佳答案

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

但是,除此之外,在这种情况下这不起作用的原因是因为 new Task(...) 不会自行启动。它只是围绕您的委托(delegate)构建任务对象。

您应该显式启动它:

var t = new Task(() => string.Empty);
t.Start();
return t;

或者简单地使用 Task.Run 代替:

return Task.Run(() => string.Empty);

(这是我避免使用 new Task(...) 的建议)

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

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

return Task.FromResult(string.Empty);

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

关于c# - 返回 Task<string> 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39525960/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com