. NET возобновить ожидание продолжения в новом потоке другого пула потоков или повторно использовать поток из предыдущего возобновления?
Давайте представим код ниже C# в приложении консоли *. 1036 * Core. :
using System;
using System.Threading;
using System.Threading.Tasks;
namespace NetCoreResume
{
class Program
{
static async Task AsyncThree()
{
await Task.Run(() =>
{
Console.WriteLine($"AsyncThree Task.Run thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
});
Console.WriteLine($"AsyncThree continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
}
static async Task AsyncTwo()
{
await AsyncThree();
Console.WriteLine($"AsyncTwo continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
}
static async Task AsyncOne()
{
await AsyncTwo();
Console.WriteLine($"AsyncOne continuation thread id:{Thread.CurrentThread.ManagedThreadId.ToString()}");
}
static void Main(string[] args)
{
AsyncOne().Wait();
Console.WriteLine("Press any key to end...");
Console.ReadKey();
}
}
}
Будет выведено:
AsyncThree Task.Run thread id:4
AsyncThree continuation thread id:4
AsyncTwo continuation thread id:4
AsyncOne continuation thread id:4
Press any key to end...
Я пытался добавить ConfigureAwait(false)
после каждого ожидания Task
, но получит тот же результат.
Как мы видим, все ожидающие продолжения повторно используют поток, созданный в методе Task.Run
из AsyncThree()
. Я хочу спросить, будет ли. NET всегда возобновлять ожидание продолжения в предыдущем потоке возобновления, или в некоторых случаях будет применяться новый поток из пула потоков?
Я знал, что ответ есть, продолжение продолжится поток пула потоков в обсуждении ниже:
async / await. Где выполняется продолжение ожидаемой части метода?
Давайте исключим случай SynchronizationContext
в приведенной выше ссылке, поскольку мы сейчас обсуждаем консольное приложение. NET. Но я хочу спросить, кажется, , что поток пула потоков в моем примере всегда thread id 4
, я не знаю, так ли это, потому что thread id 4
всегда свободен в пуле потоков, поэтому каждое продолжение использовать его по стечению обстоятельств, или. NET имеет ли механизм максимально возможное повторное использование предыдущего потока возобновления?
Есть ли возможность возобновления каждого продолжения в другом потоке пула потоков, как показано ниже?
AsyncThree Task.Run thread id:4
AsyncThree continuation thread id:5
AsyncTwo continuation thread id:6
AsyncOne continuation thread id:7
Press any key to end...