我听说过很多关于如何不使用 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);
}
}
}
}
但由于某种原因,我的函数在不同的线程中执行:
我想了解如果 async wait 不创建线程,为什么它们在不同的线程中执行。我想知道如何异步执行高负载操作,如本例所示。谁在附加线程上执行异步操作?或者它们在同一个线程中执行?
默认情况下,async/await 会有效利用现有线程的“空闲时间”:等待磁盘 I/O、网络 I/O、用户输入、屏幕刷新等的时间。 但是,
Task.Run()
队列在线程池上工作。
因此,当您调用async()
方法时,它首先从原始线程输出一条消息。然后它在新线程上开始
Task1()
方法。该代码永远不会到达下一行,因为它试图 await
此方法的结果,而这永远不会完成。