c# - 为什么这个程序会挂起?

标签 c# .net asynchronous async-await

我有以下程序:

static void Main(string[] args) { RunTest(); }

    private static void RunTest() {
        DoIOWorkFiveTimesAsync().Wait();
    }

    private static async Task DoIOWorkFiveTimesAsync() {
        for (int i = 0; i < 5; ++i) {
            Console.WriteLine("Before: " + i);
            await DoIOWorkAsync();
            Console.WriteLine("After: " + i);
        }
    }

    private static Task DoIOWorkAsync() {
        Console.WriteLine("Doing work...");
        return new Task(() => Thread.Sleep(1500));
    }

我希望看到:

  Before: 1
  Doing work...
  After: 1
  Before: 2
  Doing work...
  After: 2
  Before: 3
  Doing work...
  After: 3
  Before: 4
  Doing work...
  After: 4
  Before: 5
  Doing work...
  After: 5

但相反,它会:

Before: 1
Doing work...

而且永远不会更进一步。我已经尝试并尝试理解 C#5 中的异步/等待功能,但始终没有效果。同样,我无法解释。

最佳答案

问题是您正在使用 return new Task(() => Thread.Sleep(1500)); 而不是 Task.Run

new Task 实际上并没有启动任务,这将导致 await 永远不会触发。

相反,尝试:

private static Task DoIOWorkAsync() {
    Console.WriteLine("Doing work...");
    return Task.Run(() => Thread.Sleep(1500));
}

或者,更好的是:

private static async Task DoIOWorkAsync() {
    Console.WriteLine("Doing work...");
    await Task.Delay(1500);
}

关于c# - 为什么这个程序会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18449675/

相关文章:

c# - I18N C# 应用程序

c# - 项目已过时 - 不再显示此对话框 - 构建还是不构建?

c# - nHibernate:在创建子对象时保存新的父对象

javascript - 如何使用 Angular JS 获取 POST 请求的响应?

c# - 仅当它是 select 语句时才执行查询。如何?

c# - 使用 "as"运算符测试 Page.RouteData.Values 中的整数类型

c# - 对 CLR 施加内存限制

c# - 为什么 EF 试图在 id 列中插入 NULL?

java - Spring Boot Async方法如何使用ThreadPool处理请求

c# - 等待大量任务