Я пытался определить лучший способ запуска кода одновременно/параллельно с остальной частью моего кода, возможно, используя поток. Из того, что я прочитал, с использованием Thread
типа нет-нет в современном C#. Первоначально я думал Parallel.Invoke()
, но это оказывается блокирующим вызовом до завершения всей внутренней работы.Task.Factory.StartNew не работает, как я ожидал
В моем приложении мне не нужно ждать завершения чего-либо, я не хочу получать результат, мне нужен код, который полностью не зависит от текущего потока. В принципе идея «огонь и забыть».
Из того, что, как я думал, я понимаю, Task.Factory.StartNew()
- это правильный способ запуска части кода одновременно/параллельно с текущим кодом.
Основываясь на этом, я думал, что следующий код будет случайным образом распечатывать «ABABBABABAA».
void Main()
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.Write("A");
}
});
for (int i = 0; i < 10; i++)
{
Console.Write("B");
}
}
Однако, это:
- печать из «BBBBBBBBBBAAAAAAAAAA»
- Если я поменять Task.Factory.StartNew с
for
и наоборот та же последовательность печатается, что кажется странно.
Так что это заставляет меня думать, что Task.Factory.StartNew()
фактически никогда не планировать работу к другому потоку, как будто вызывая StartNew
является блокирующим вызовом.
Учитывая, что мне не нужны какие-либо результаты или ждать/await
, было бы проще для меня просто создать новый Thread
и запустить там мой код? Единственная проблема, что я с этим в том, что с помощью Thread
кажется противоположность современной передовой практики и книга «Параллелизм в C# 6.0» говорится:
Как только вы наберете новую тему(), это над; Ваш проект уже имеет устаревший код.
Нет ничего странного в выходе. Задача «будет запущена в какой-то момент после», это запланировано. На этот раз происходит после того, как цикл inline запущен (поскольку он запускался сразу после запланированной задачи), а тестовый код ничего интересного не показывает. Добавление в задержка 100 мс между каждой итерацией цикла в обоих случаях должно изменить наблюдение. – user2864740
Хм, я вижу. Я изменил петли, чтобы иметь значительно более высокую ценность, теперь я вижу AAAAABBBBBAAAAA много. Так было ли это так, что я просто не уделял достаточно времени, чтобы задача была запланирована? – user9993
В этом случае - да. Кроме того, большинство потоков фактически выполняются с чередованием, а не по-настоящему (это тривиально визуализировать в 1-ядерной системе, хотя n-ядерный процессор все равно будет запускать m потоков, где m >>> n). – user2864740