异步和等待不起作用

本文关键字:不起作用 等待 异步 | 更新日期: 2023-09-27 18:35:08

我正在尝试学习.NET 4.5的异步和等待功能。首先这是我的代码

    static async void Method()
    {
        await Task.Run(new Action(DoSomeProcess));
        Console.WriteLine("All Methods have been executed");
    }
    static void DoSomeProcess()
    {
        System.Threading.Thread.Sleep(3000);
    }
    static void Main(string[] args)
    {
        Method();
        //Console.WriteLine("Method Started");
        Console.ReadKey();
    }

这段代码在控制台上没有给我任何结果。我不明白为什么。我的意思是,任务不是应该只是没有阻塞的线程吗?但是,如果我在主方法中取消注释 Console.WriteLine() 一切似乎都工作正常。

谁能告诉我这里发生了什么?

异步和等待不起作用

对于异步/等待模式,有些事情与以前的线程不同。

  1. 你不应该使用System.Threading.Thread.Sleep因为这仍然是阻塞的,不适用于异步。而是使用Task.Delay

  2. 考虑使所有代码异步。只有控制台中的 Main 方法不能异步原因

  3. 避免async void方法。基本上,异步 void 仅适用于无法返回某些内容的事件处理程序。所有其他异步方法应返回TaskTask<T>

修改了您的示例:

    static async Task Method()
    {
        await DoSomeProcess();
        Console.WriteLine("All Methods have been executed");
    }
    static async Task DoSomeProcess()
    {
        await Task.Delay(3000);
    }

现在更改您的 Main 方法,因为这应该是您开始任务的地方

    Task.Run(() => Method()).Wait();
    //Console.WriteLine("Method Started");
    Console.ReadKey();

学习如何正确使用asyncawait关键字有一个很小的学习曲线。

问题是没有人在等待谁在等待,还有其他一些细节,例如SyncronizationContextTask

您应该查看一些文章:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

要在控制台中使用 async 和 await 关键字,您需要一个额外的代码:无法在控制台应用的"Main"方法上指定"异步"修饰符,或者等待单元测试的异步 void 方法调用或单元测试资源管理器未显示 Metro 应用的异步单元测试

我通常这样做:

static void Main(string[] args)
{
    Console.WriteLine("HELLO WORLD");
    var t1 = Task.Factory.StartNew(new Func<Task>(async () => await Method()))
        .Unwrap();
    Console.WriteLine("STARTED");
    t1.Wait();
    Console.WriteLine("COMPLETED");
    Console.ReadKey();
}
static async Task Method()
{
    // this method is perfectly safe to use async / await keywords
    Console.WriteLine("BEFORE DELAY");
    await Task.Delay(1000);
    Console.WriteLine("AFTER DELAY");
}