C # |Программа ничего не делает после выполнения потока - PullRequest
2 голосов
/ 10 октября 2011

Мой поток должен вернуть массив-список и поместить его в файлы.
Моя проблема в том, что он просто останавливается (по крайней мере, так я его вижу).
Тема:

 ArrayList files = new ArrayList();
            Thread getF = new Thread(delegate()
            {
                files = GetFiles(path);
            });
            getF.Start();
            if (getF.ThreadState == ThreadState.Stopped)
            {
                MessageBox.Show(files.Count.ToString());
                foreach (string file in files)
                {
                    if (file != "")
                    {...

getFiles:

ArrayList results = new ArrayList();
            try
            {
             *loops**code*...
            results.Add(srl);//add file to arrFiles
            *end loops*

                MessageBox.Show("Complete");
                return results;
            }

Программа просто выдает мне MessageBox.Show ("Complete"), а затем ничего не делает.Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 октября 2011
        getF.Start();
        if (getF.ThreadState == ThreadState.Stopped)
        {
           //...
        }

То, что оператор if () никогда не будет выполнен. Потоку требуется время, чтобы сделать свою работу. Вы должны будете вставить getF.Join (), но это лишает смысла использование потока.

Используйте класс BackgroundWorker.

1 голос
/ 10 октября 2011

Вполне вероятно, что поток не будет завершен до выполнения условия. То есть у вас есть:

getF.Start();
if (getF.ThreadState == ThreadState.Stopped)

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

Типичным способом ожидания завершения потока является вызов Join. То есть:

getf.Start();
getf.Join(); // suspends main thread until the child thread is done

Но если вы сделаете это, вы заблокируете свой пользовательский интерфейс.

Причина использования нескольких потоков заключается в том, что основной поток (поток пользовательского интерфейса, в вашем случае) может выполнять другие действия, пока другие потоки выполняют свою работу. Я подозреваю, что вам нужен BackgroundWorker , который получит файлы, а затем выполнит некоторые действия после того, как это будет сделано - в обработчике RunWorkerCompleted.

1 голос
/ 10 октября 2011

AFAIK, Thread.Start() возвращается сразу после запуска потока. Поэтому, прежде чем проверять ThreadState, следует дождаться его завершения. Ожидание окончания потока обсуждалось в Этот вопрос

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