Довольно ясно, что использование Task
с async/await
вместо Thread
- это способ сделать асинхронные вызовы. Мой вопрос в том, что есть способ контролировать потоки, которые порождаются при выполнении этих задач? Это значит, что я могу выбрать оптимальное количество Заданий для планирования, чтобы потоки не потребляли много циклов процессора одновременно (при условии, что Задачи имеют интенсивность процессора).Как узнать количество созданных потоков и ограничить задачи
Приведем пример ниже (также упоминается вывод). Хотя программа завершается за 5 секунд, она создала два потока (Id = 1,4) для выполнения всех задач. Если я увеличиваю количество заданий до 6 вместо 2, он создает 4 темы. Я знаю, что эти потоки CLR сопоставляются с потоками ОС (которые составляют всего 4 на моей машине), но я хотел бы знать, как они отображаются (вместе с задачами) и соответствующим использованием ЦП. Есть ли способ достичь этого?
TEST CODE
static void Main(string[] args)
{
RunTasksWithDelays().Wait();
}
static async Task RunTasksWithDelays()
{
Stopwatch s = Stopwatch.StartNew();
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Task task1 = LongRunningTask1();
Task task2 = LongRunningTask2();
await Task.WhenAll(task1, task2);
Console.WriteLine("total seconds elapsed: " + s.ElapsedMilliseconds/1000);
}
static async Task LongRunningTask1()
{
Console.WriteLine("1 start " + DateTime.Now);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(5000);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("1 end " + DateTime.Now);
}
static async Task LongRunningTask2()
{
Console.WriteLine("2 start " + DateTime.Now);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(2000);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("2 end " + DateTime.Now);
}
ВЫВОД
ThreadId=1
1 start 28-10-2014 18:27:03
ThreadId=1
2 start 28-10-2014 18:27:03
ThreadId=1
ThreadId=4
2 end 28-10-2014 18:27:05
ThreadId=4
1 end 28-10-2014 18:27:08
total seconds elapsed: 5
Press any key to continue . . .
Не уверен, если я понимаю ваш вопрос, но, насколько я знаю, задачи Parallel Библиотека интеллектуально идентифицирует эффективное количество потоков для обработки задач на основе конфигурации вашего оборудования. Одним из пунктов TPL является то, что вы не беспокоитесь о планировании и объединении потоков. – Iravanchi