【方式一】:
private static async Task Main(string[] args)
{
Console.WriteLine($"主线程开始ID:{Environment.CurrentManagedThreadId}");//a
Task task = Task.Run(async () =>
{
Console.WriteLine($"异步线程ID开始:{Environment.CurrentManagedThreadId}");//b
await Task.Delay(1000);//c
Console.WriteLine($"异步线程ID结束:{Environment.CurrentManagedThreadId}");//d
});
//await Task.Delay(100);//e
Console.WriteLine($"主线程结束ID:{Environment.CurrentManagedThreadId}");//f
Console.ReadKey();
}
【结果】:
主线程开始ID:1
主线程结束ID:1
异步线程ID开始:3
异步线程ID结束:4
说明c处用了await后,新开延时线程执行完后,并没有返回线程池,而是继续向下执行d处,所以b与d的线程ID是不同的。
【方式二】:(上面例子,取消e处的注释)
private static async Task Main(string[] args)
{
Console.WriteLine($"主线程开始ID:{Environment.CurrentManagedThreadId}");//a
Task task = Task.Run(async () =>
{
Console.WriteLine($"异步线程ID开始:{Environment.CurrentManagedThreadId}");//b
await Task.Delay(1000);//c
Console.WriteLine($"异步线程ID结束:{Environment.CurrentManagedThreadId}");//d
});
await Task.Delay(100);//e
Console.WriteLine($"主线程结束ID:{Environment.CurrentManagedThreadId}");//f
Console.ReadKey();
}
【结果】:
主线程开始ID:1
异步线程ID开始:3
主线程结束ID:5
异步线程ID结束:3
上面显示b和d的ID是一样的,为什么?await新开的异步线程不应该继续继续执行吗?d的线程应该与c相同,而与b不同。为什么是一样的呢?
苦恼。
private static async Task Main(string[] args)
{
Console.WriteLine($"主线程开始ID:{Environment.CurrentManagedThreadId}");//a
Task task = Task.Run(async () =>
{
Console.WriteLine($"异步线程ID开始:{Environment.CurrentManagedThreadId}");//b
await Task.Delay(1000);//c
Console.WriteLine($"异步线程ID结束:{Environment.CurrentManagedThreadId}");//d
});
//await Task.Delay(100);//e
Console.WriteLine($"主线程结束ID:{Environment.CurrentManagedThreadId}");//f
Console.ReadKey();
}
【结果】:
主线程开始ID:1
主线程结束ID:1
异步线程ID开始:3
异步线程ID结束:4
说明c处用了await后,新开延时线程执行完后,并没有返回线程池,而是继续向下执行d处,所以b与d的线程ID是不同的。
【方式二】:(上面例子,取消e处的注释)
private static async Task Main(string[] args)
{
Console.WriteLine($"主线程开始ID:{Environment.CurrentManagedThreadId}");//a
Task task = Task.Run(async () =>
{
Console.WriteLine($"异步线程ID开始:{Environment.CurrentManagedThreadId}");//b
await Task.Delay(1000);//c
Console.WriteLine($"异步线程ID结束:{Environment.CurrentManagedThreadId}");//d
});
await Task.Delay(100);//e
Console.WriteLine($"主线程结束ID:{Environment.CurrentManagedThreadId}");//f
Console.ReadKey();
}
【结果】:
主线程开始ID:1
异步线程ID开始:3
主线程结束ID:5
异步线程ID结束:3
上面显示b和d的ID是一样的,为什么?await新开的异步线程不应该继续继续执行吗?d的线程应该与c相同,而与b不同。为什么是一样的呢?
苦恼。