由于基于任务的异步模式现在是推荐的路线(根据 MSDN @ here 和 here ),我将如何转换简单的 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/