Пауза Для каждого, пока не закончится Тема внутри C #

1

У меня проблемы с этим кодом. Я использую.Net (С#) с приложением Winform.

У меня есть цикл foreach для файлов внутри каталога, и с каждым файлом я хочу запустить поток с некоторыми функциями. Проблема в том, что цикл не ждет завершения потока, и результат получается, если у меня есть 5 файлов, я получаю 5 потоков друг с другом сделать мой компьютер заморозить.. возможно ли приостановить цикл до конца потока, а затем продолжить цикл для других потоков?

foreach (string f in Directory.GetFiles(txtPath.Text))
{
    Thread threadConversion = new Thread(new ParameterizedThreadStart(function name));
    threadConversion.Start(function parameter);
}
  • 1
    Почему бы не использовать Parallel вместо ??
Теги:
multithreading

3 ответа

3
Лучший ответ

Если вы хотите последовательно читать файлы, почему бы не переместить все это в поток?

Thread threadConversion = new Thread(() => {
    foreach (string f in Directory.GetFiles(txtPath.Text))
    {
        //read file f
    }
});

threadConversion.Start();

Или еще лучше, используйте Задачи:

await Task.Run(() => {
    foreach (string f in Directory.GetFiles(txtPath.Text))
    {
        //read file f
    }
});

//do some other stuff
1

Вам просто не нужно запускать метод как поток. Просто запустите его так:

foreach (string f in Directory.GetFiles(txtPath.Text))
{
    function(parameter);
}
  • 0
    Я предполагаю, что OP хочет читать файлы из другого потока, чтобы не замораживать поток пользовательского интерфейса.
  • 0
    Тогда он должен запустить весь foreach в другой ветке. Поскольку нет никаких действий пользовательского интерфейса, это не должно быть проблемой.
Показать ещё 1 комментарий
0

Вы можете использовать метод Parallel.ForEach (вы должны хотя бы версия.net 4.0)

Например

 Parallel.ForEach(Directory.GetFiles(txtPath.Text), f=>
                {
                 //some code
                }
                );
  • 1
    Parallel.Foreach уже существует в 4.0
  • 0
    @ Spoising вы правы :) спасибо, я исправляю свой ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню