具有异步/等待的不同线程

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

我听说过很多关于如何不使用 async awiat 创建新线程的信息。我决定检查一下如果主函数和异步函数中有 while(true) 会发生什么。

namespace asyncTest
{
    public class Program
    {

        public static void Task1()
        {
            while (true) {
                Console.WriteLine("Task1: " + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }
        }

        public static async void async()
        {
            Console.WriteLine("async start: " + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(Task1);
            Console.WriteLine("async end: " + Thread.CurrentThread.ManagedThreadId);
        }

        static void Main(string[] args)
        {
            async();
            while (true) {
                Console.WriteLine("main: " + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            }
        }
    }
}

但由于某种原因,我的函数在不同的线程中执行:

enter image description here

我想了解如果 async wait 不创建线程,为什么它们在不同的线程中执行。我想知道如何异步执行高负载操作,如本例所示。谁在附加线程上执行异步操作?或者它们在同一个线程中执行?

c# asynchronous async-await
1个回答
0
投票

默认情况下,async/await 会有效利用现有线程的“空闲时间”:等待磁盘 I/O、网络 I/O、用户输入、屏幕刷新等的时间。 但是,

Task.Run()

队列在线程池上工作。

因此,当您调用 

async()

方法时,它首先从原始线程输出一条消息。然后它在新线程上开始

Task1()
方法。该代码永远不会到达下一行,因为它试图
await
此方法的结果,而这永远不会完成。
    

© www.soinside.com 2019 - 2024. All rights reserved.