C # поток начинается с отладчика, но не запускается автономно - PullRequest
1 голос
/ 05 января 2009

У меня есть небольшое приложение, которое ищет и хранит имена большого количества файлов при запуске. Я делю этот поиск на несколько объектов Thread, каждый из которых выполняет поиск по одному каталогу, и отправляю результаты обратно в основной поток.

Когда приложение загружается, я прохожу каждый поток и загружаю его:

foreach(Thread t in m_threads)
{
    t.Start();
    while(!t.IsAlive){}
}

Когда я запускаю это приложение в отладчике, оно загружается, и потоки быстро находят все файлы. Однако, если я запускаю вне отладчика, он зависает. Присоединяя отладчик к процессу, я вижу, что IsAlive никогда не возвращает true.

Я новичок в потоке C #, так что у кого-нибудь есть идеи, что идет не так, или как мне легче отлаживать то, что происходит?

Ответы [ 7 ]

3 голосов
/ 05 января 2009

Поток мог завершить обработку перед проверкой на IsAlive.

Почему вы ждете, проверив флаг IsAlive?

Почему бы вместо этого не запустить все потоки, а затем в другом цикле вызвать Join () , чтобы дождаться завершения потоков? Не нужно проверять "IsAlive".

Еще лучше, почему бы не использовать ThreadPool вместо того, чтобы запускать стек потоков самостоятельно?

2 голосов
/ 05 января 2009

Это может быть не совсем связано с тем, почему вещи замораживаются, но ваша реализация весьма сомнительна. Вы перечисляете коллекцию потоков, запускаете каждый из них, но затем блокируете, пока поток не закончится? Я думаю, что вы, возможно, хотели сделать, это запустить все потоки, а затем блокировать, пока все потоки не закончатся. (Примечание: это предполагает, что вы хотели написать: " while (t.IsAlive) {} ", поскольку ожидание запуска потока имеет еще меньше смысла.)

Что касается замораживания, нам может понадобиться увидеть остальную часть кода. Поскольку вы сказали, что вы новичок в многопоточности C # и, глядя на то, что вы делали выше, я предполагаю, что вы новичок в многопоточности, что означает, что может быть много мест, где может возникнуть проблема.

1 голос
/ 05 января 2009

Я бы рекомендовал не хранить коллекцию потоков, а вместо этого использовать Threadstarts. Если вы присоединитесь к ним позже, вам не нужно ждать, пока поток не запустится, поэтому цикл while не нужен. Убедитесь, что ваши потоки помечены как фоновые потоки, поэтому они автоматически очищаются после выполнения.

Я бы сделал это так: List threadStarters = new List ();

foreach (ThreadStart ts in threadStarters)
{
    Thread t = new Thread(ts);
    t.IsBackground = true;
    t.Start();
}
1 голос
/ 05 января 2009

С кодом, который вы предоставили выше, мне кажется, что вы хотите запускать потоки последовательно. Если так, зачем вам много тем? 1 поток может сделать работу.

РЕДАКТИРОВАТЬ: (после вашего ответа)

Ok. Я вижу, что вы удалили сомнительную строку.

Несмотря на это, в вашем случае я бы подумал об использовании только одного потока для загрузки этих имен файлов, поскольку вы обращаетесь только к одному ресурсу ввода-вывода (диску). Каждый поток конкурирует за этот ресурс. Вы пытались переместить 1 большой файл в Windows, а затем переместить другой большой файл, пока первый еще находится в движении? Производительность вашего диска снижается. Из-за этого я бы создал только один поток для каждого отдельного ресурса ввода-вывода.

1 голос
/ 05 января 2009

Похоже, я неправильно понял код, который я вырезал и вставил для создания своего многопоточного кода. Я предположил, что строка while (! T.isAlive) {} блокировалась до тех пор, пока поток не мог правильно запуститься, и подумал, что это необходимо для администрирования.

Я удалил эту строку, и приложение нормально запускается из отладчика. Я присоединяюсь к темам позже в коде, так что должно быть.

Есть ли "NEWB!" тег? :)

1 голос
/ 05 января 2009

Возможно, вы имеете в виду IsAlive() "никогда не возвращает ложь".

Ну, если так, то это потому, что ваши потоки продолжают выполняться бесконечно. Возможно, метод, который вы вызываете в этих потоках, имеет бесконечный цикл или что-то в этом роде.

0 голосов
/ 05 января 2009

Я не знаю точно, что вы делаете в своих темах, но я думаю, что ...

Многопоточность + Приложение работает по-разному с подключенным отладчиком = Условия гонки

Я почти уверен, что у вас есть проблемы с синхронизацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...