基于任务的异步模式的"Hello World"?

Dee*_*101 6 .net multithreading task-parallel-library

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

让我们假设我什么都不知道Tasks,我试图向工作人员演示输入和输出,以及从'main'调用.

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!";
    }
}
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 4

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

如果您想让等待内部DoWork()异步,这意味着将签名从stringto更改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!";
    }
}
Run Code Online (Sandbox Code Playgroud)