У меня есть этот код:
var dt = new DeveloperTest();
var tasks = readers.Select(dt.ProcessReaderAsync).ToList();
var printCounterTask = new Task(() => dt.DelayedPrint(output));
printCounterTask.Start();
Task.WhenAll(tasks).ContinueWith(x => dt.Print(output).ContinueWith(_ =>
{
dt.Finished = true;
})).Wait();
printCounterTask.Wait();
То, что это делает, это подготовка задач, которые будут выполняться, а затем начать (я думаю) параллельное выполнение, которое начинается с:
printCounterTask.Start();
Вот что делает отложенная печать:
public async Task DelayedPrint(IOutputResult output)
{
while (true)
{
if (!Finished)
{
//every 10 seconds should print.
//at least one print even if the execution is less than 10 seconds
//as this starts in paralel with the processing
Task.Delay(10 * 1000).Wait();
await Print(output);
}
else
{
#if DEBUG
Console.WriteLine("Finished with printing");
#endif
break;
}
}
}
По сути, печать некоторого вывода, который задерживается каждые 10 секунд, затем, когда все задачи завершены, останавливает бесконечное l oop. если вы хотите увидеть весь код здесь https://github.com/velchev/Exclaimer-Test
Я не уверен, что этот
Task.WhenAll(tasks).ContinueWith(x => dt.Print(output).ContinueWith(_ =>
{
dt.Finished = true;
})).Wait();
работает параллельно с printCounterTask.Start (); Когда я дебютирую, кажется, что это происходит как точка останова в! Завершенном коде, а затем в предложении else. Насколько я знаю, когда вы запускаете задачу, она запускается параллельно, поэтому все задачи должны выполняться параллельно. Задача - это представление потока, синтаксически которым легче управлять по сравнению со старым синтаксисом. Так что все эти потоки работают, и из-за лучшего синтаксиса проще сказать - подождите, пока все не закончатся sh, а затем измените флаг. Любое полезное объяснение будет оценено. Спасибо вам, друзья.