我下面对Context在async await方面的理解是否正确?[已关闭]

问题描述 投票:0回答:2

我正在经历 https:/blog.stephencleary.com201202async-and-await.html。 而据作者说, Context 是以下任何一种。

  1. 如果你在一个UI线程上,那么它是一个UI上下文。

  2. 如果你正在响应一个ASP.NET请求,那么它是一个ASP.NET请求上下文。

  3. 否则,它通常是一个线程池上下文。

所以在一个控制台应用程序中,有如下代码。

public static void Main()
{
    Thread.CurrentThread.Name = "MainThread";
    var task = SomeAsync();
    string result = task.Result;
    Console.WriteLine(result);
}

private static async Task<string> SomeAsync() {
    await Task.Delay(2000);
    return "random String";
}

我们在这里启动一个async方法 Main 方法。这个异步方法的执行将需要2秒,当它完成时,控件将回到 Main 方法的那一行,我们在async方法的结果上进行阻塞。所以我们可以说 MainThread 被阻挡在那里,等待 SomeAsync. 届时 SomeAsync 完成后, MainThread 仍然被阻塞。

那么我是否可以说async方法的继续将在线程池的不同线程上执行(因为这段代码工作并正确打印字符串)?如果是UI应用,会导致死锁,但如果是控制台应用,则不会出现死锁。控制台应用程序是无上下文的,在需要的时候可能会从线程池中使用一个新的线程吗?

c# asynchronous async-await console-application
2个回答
1
投票

在你的方法中使用async不一定会导致创建一个新的线程。

使用asyncawait是否会创建一个新线程?

特别是在你的例子中,你实际上是在同步运行这个方法(没有 await),那么这个方法很可能会在一个线程上运行。 为了真正 "测试 "async功能,你应该开始等待结果,然后看看会发生什么。


0
投票

我试着向你展示一下异步等待的工作原理。

class Program
{
    static void Main(string[] args)
    {
        TestAsync().Wait(); //This will run synchronously
    }

    private static async Task TestAsync()
    {
        Log("Test started");

        Log("Application will be blocked for 5 seconds");
        await Wait5Seconds();
        Log("Now it will run again");

        var task = Wait20Seconds();
        while (!task.IsCompleted)
        {
            Log("This will be logged during method execution cause we didn't await it");
        }

        var task1 = Wait20Seconds();
        Log("We will execute this log and then we will await the end of the execution of our task");
        await task1;

        Log("Test ended");
    }

    private static async Task Wait5Seconds()
    {
        await Task.Delay(1000 * 5);
    }

    private static async Task Wait20Seconds()
    {
        await Task.Delay(1000 * 20);
        Log("DONE!");
    }

    private static void Log(string message)
    {
        Console.WriteLine(string.Format("{0} - {1}", DateTime.Now, message));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.