gpt4 book ai didi

C# 异步,为什么我们需要 "hold"控制台来获取异步结果?

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:39 24 4
gpt4 key购买 nike

在过去的几天里,我一直在试图弄清楚为什么我的异步方法不起作用,它是一段非常简单的代码。

public class EntryPoint
{
static void Main()
{
RunTheTaskAsync();
//Console.ReadLine(); // if I add this to "hold" the finish of the project, I will see the result, without it I dont
}

public async static void RunTheTaskAsync()
{
Task<string> task = Concatenator('1', 200000);

Console.WriteLine("Heeeelllooooooo");
Console.WriteLine("I am running while Concatenator is concatenating in the background.");
Console.WriteLine("You will receive the results shortly");
string result = await task;

Console.WriteLine("Result is: " + result.Length);
}

public static Task<string> Concatenator(char characterToConcatenate, int count)
{
Console.WriteLine("Concatenating!");

return Task<string>.Factory.StartNew(() =>
{
string concatenatedString = "";

for (int i = 0; i < count; i++)
{
concatenatedString += characterToConcatenate;
}

return concatenatedString;
});
}
}

如果我按照上面的示例运行它,我永远看不到结果,我只看到 Console.WriteLine 和按任意键继续..之后没有结果。如果我取消注释 Console.ReadLine();一切正常,正如我所期望的那样,我只是不明白为什么!?!如果我添加一些 Thread.Sleep(xxx) 或另一段比“连接器”方法执行时间更长的代码,情况也是如此。这不是 await 应该自行解决的问题之一吗,从它的名字就可以看出。我的理解是:

  • Task 方法开始在后台执行
  • 我们在异步方法中处理 3 个 ConsoleWritelines
  • 因为没有别的事可做,任务还没有完成,我们到了 await 行,我们应该await 任务待完成,然后继续执行其余代码。

只有当中间有另一段代码比 Task 方法的执行时间更长时,或者如果我使用 Console.ReadLine() 并且我找不到关于此的解释时,它才会像这样工作!

我还有一个关于我的实现语法的次要问题。这是创建任务方法的正确方法吗?通过使用

public Task<T> SomeMethodName(some, args)
{
return Task<T>Factory.StartNew(() =>
{
somecode that returns T;
});
}

最佳答案

async void(如您的 RunTheTaskAsync 方法)是“即发即忘”。您无法跟踪他们的进度并且几乎不想使用它们。

相反,创建一个async Task 并等待它:

static async Task Main()
{
await RunTheTaskAsync();
}

public static async Task RunTheTaskAsync()
{
...
}

更多详细信息,请参阅:

注意:2017 更新 3 之前的 Visual Studio 不支持 async Main 方法。在那种情况下,你必须 manually await the Task :

static void Main()
{
RunTheTaskAsync().GetAwaiter().Wait();
}

关于你的第二个问题(对于 future :SO 的政策是“每个问题一个问题”):是的,如果你需要你的任务在一个单独的线程中运行,Task.Factory.StartNew 是正确的.较新版本的 .NET 提供 Task.Run 作为快捷方式,有关详细信息,请参阅以下问题:

关于C# 异步,为什么我们需要 "hold"控制台来获取异步结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48813488/

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