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

标签 .net multithreading task-parallel-library

由于基于任务的异步模式现在是推荐的路线(根据 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/

相关文章:

.net - 将审计列添加到 Fluent NHibernate 多对多联结表

c# - 将秒表与异步方法一起使用

c# - 错误 : return keyword must not be followed by an object expression in c# async code

c# - CurrentThreadTaskScheduler 没有完成同步

.net - 当 -sDEVICE 是图像格式时,将多页打印到 %printer%?

c# - ASP.NET mvc4 DropDownListFor 传回一个对象

C++从主线程结束分离线程

c - 在 Gtk+2.0 应用程序中使用 pthreads 的安全性

java - 我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?

.net - 即使设置了策略,对 SQS 队列的访问也会被拒绝