gpt4 book ai didi

.net - "Hello World"用于基于任务的异步模式?

转载 作者:行者123 更新时间:2023-12-03 21:38:29 25 4
gpt4 key购买 nike

由于基于任务的异步模式现在是推荐的路线(根据 MSDN @ herehere ),我将如何转换简单的 hello world下面的代码变成基于任务的异步模式?

假设我对 Tasks 一无所知我试图演示从工作人员的输入和输出以及从“主”调用。

class Program
{
static void Main(string[] args)
{
Worker wk = new Worker();
string result = wk.DoWork(1000);
Console.WriteLine(result);
Console.WriteLine("Main says, Hello World!");
Console.ReadLine();
}

}
class Worker
{
public string DoWork(int delay)
{
Console.WriteLine("Worker says, working ...");
Thread.Sleep(delay); // represents the 100ms+ workload
return "Worker says, I'm done! Hello World!";
}
}

最佳答案

这取决于您究竟要使异步做什么。如果Thread.Sleep()代表一些 CPU 密集型工作,那么您不会从使用 TAP 中获得太多 yield 。

如果你想在里面等待 DoWork()异步,这意味着从 string 更改签名至 async Task<string>然后使用 await Task.Delay()而不是 Thread.Sleep() .

如果你也想做Main()异步,如果您使用的是 C# 7.1 或更高版本,则可以。

如果您使用的是旧版本的 C#,那么它就变成了。你可以做的是创建异步 MainAsync()然后同步 Wait()真正的Main() .这意味着主线程将被阻塞,但我们需要它来保持应用程序的事件。此外,混合异步 await同步 Wait()通常不是一个好主意(特别是因为它经常导致死锁),但在这种情况下没关系。

如果我们制作 Main()异步,最好能阻塞 ReadLine()也是异步的。没有Console.ReadLineAsync() ,但我们可以使用 Console.In为了那个原因。

所以,最终的代码看起来像这样:

class Program
{
static void Main()
{
MainAsync().Wait();
}

static async Task MainAsync()
{
var worker = new Worker();
string result = await worker.DoWork(1000);
Console.WriteLine(result);
Console.WriteLine("Main says, Hello World!");
await Console.In.ReadLineAsync();
}
}

class Worker
{
public async Task<string> DoWork(int delay)
{
Console.WriteLine("Worker says, working ...");
await Task.Delay(delay); // represents the 100ms+ workload
return "Worker says, I'm done! Hello World!";
}
}

关于.net - "Hello World"用于基于任务的异步模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13592075/

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