Почему запуск нового потока внутри Parallel.ForEachAsync приводит к тому, что мой код мешает сам себе?C#

Место общения программистов C#
Ответить
Anonymous
 Почему запуск нового потока внутри Parallel.ForEachAsync приводит к тому, что мой код мешает сам себе?

Сообщение Anonymous »

У меня есть приложение C# со списком задач. Внутри задачи некоторые задачи создают новый поток и ждут его завершения следующим образом:
Thread CompileThread = new Thread(LoadAndCompile, 10000000); //Use a new thread to compile because a 1MB stack is too small.
CompileThread.Start();
CompileThread.Join();

Если я вызываю эти задачи с помощью цикла foreach, все в порядке; задачи LoadAndCompile выполняются последовательно, и все выполняется до завершения, как и ожидалось.
Если я помещу эти задачи в Parallel.ForEachAsync, действия LoadAndCompile завершится с ошибкой. Меня это смущает; Я получаю результаты внутри потока, предполагающие, что между моими потоками, порождаемыми внутри цикла Parallel.ForEachAsync, существует некое общее состояние, хотя в используемых мной классах нет статических переменных.
Есть ли этому объяснение взаимодействия между Parallel.ForEachAsync и Thread.Start()/Thread.Join(), которое я не понимаю, или это звучит так, будто у меня есть статическая/общая переменная, которая Я не знаю?
Вот сломанная версия, а рабочая версия показана в комментариях ниже:
var options = new ParallelOptions()
{
MaxDegreeOfParallelism = 20
};

CancellationToken ct = new CancellationToken();

await Parallel.ForEachAsync(selectedControllerPaths, options, async (selectedControllerPath, ct) => {
await System.Threading.Tasks.Task.Run(() => ImportControllerMulti(selectedControllerPath.FilePath));
});
//foreach (var selectedControllerPath in selectedControllerPaths)
//{
// await System.Threading.Tasks.Task.Run(() => ImportControllerMulti(selectedControllerPath.FilePath));
//}


Подробнее здесь: https://stackoverflow.com/questions/790 ... de-to-inte
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»