2010-02-28 2 views
0
private void ParallelCrashTest() 
{ 

    for (int x = 0;x < 100; x++) 
    { 
     Dowork_1(i); 
    } 
} 

private void Dowork_1(int i) 
{ 
ThreadInfo threadInfo = new ThreadInfo(); 
threadInfo.first = 0; 
threadInfo.last = 100; 
for (int x = 0;x < 60; x++) 
    { 
     Dowork_2(threadinfo); 
     progressBar2.Value = x + 1; 
    } 
} 
private void Dowork_2(object param) 
{ 

    ThreadInfo threadInfo = param as ThreadInfo; 
    int first = threadInfo.first; 
    int last = threadInfo.last; 
    Parallel.For(first, last, i => 
    { 

     didsomthing... 

    } 

    Update(); 

} 

Так что это не сработает. (Процессор работает 90-100%, это значит, что я догадываюсь, что все еще работает над моим приложением) Я использовал Update() вместо Application.DoEvent(). Мое приложение отключено или не может обновить(). Я не знаю . Я думаю, что может быть проблемой Update(), но я не уверен. Есть ли у вас предложения ? Спасибо.stacktrace на VS2010

+2

Что такое "didsomthing?" Готов поспорить, что все, что вызвало это, произошло. Вероятно, пытается обновить графический интерфейс. – Aaronaught

+2

@ the fail troll не работает. Мне также нравятся вопросы «MY APP CRASHED HURR» без каких-либо исключений *. Как мы можем махать волшебной палочкой и знать, почему что-то разбилось. Кроме того, Application.DoEvents в многопоточном приложении? Гай должен сесть с хорошей книгой и учиться. – Will

+0

@Will: Вы имеете в виду, что вы не имеете волшебную палочку для отладки? Я заплатил верхний доллар за шахту, но он того стоил, больше не надоедливых сбоев приложений! – Aaronaught

ответ

2

Сбой в каком виде?

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

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

+0

На самом деле, когда я использую цикл «For», это было прекрасно, но это занимает много времени. Поэтому мне нужно сократить время. Я просто изменил «Parallel.For» вместо цикла «For». Я думаю, что didsomething не имеет значения, потому что он работал, когда я использую цикл for for – tonyontlga

+0

@tonontlga: Когда вы используете 'for', он запускается в том же потоке. 'Parallel.For' разрешено использовать много разных потоков. Я думаю, ваша проблема в том, что вы обновляете GUI внутри параллели, но это также может быть связано с потоками. Вы не предоставили достаточно кода для меня, чтобы быть уверенным в чем проблема. Попробуйте сделать компилируемый и исполняемый минимально упрощенный пример, который воспроизводит ошибку и публикует ее. –

+0

Да, я использую индикатор выполнения. Мое приложение работает в течение нескольких минут. Внезапно он разбился. Я имею в виду середину всего времени работы программы. :) – tonyontlga

1

Ни метод Update(), ни назначение progressBar2.Value не являются законными из рабочего потока. Это не приведет к сбою Visual Studio, даже VS2010, вы получите простое исключение IllegalOperationException, чтобы сказать вам, что вы делаете что-то неправильное.

Вам необходимо использовать метод Control.Invoke(). В статье, связанной с MSDN, есть хороший пример.

+0

да я использовал рабочий поток. это как обходной процесс. Но внутри цикла «paralle.for» требуется много времени. Вот почему это было плохо. я должен организовать расписание. – tonyontlga

Смежные вопросы