2010-07-07 7 views
3

Мое программное обеспечение требует хранения каталога и структуры реестра для определенных местоположений. Это обычно занимает много времени. Предположим, у меня есть метод, называемый SaveState(), который делает это.C#: отображение модального диалогового окна прогресса в течение длительного процесса

Я хочу обернуть это другим методом, SaveStateWithProgress(), так что, когда я его назову, появится модальное диалоговое окно, которое показывает простую индикацию выполнения и имеет кнопку для отмены операции. То, как я его вижу, мне может понадобиться использовать два потока, хотя в VB6 или Java я использовал прохождение с эквивалентом команды Thread.Yield() - не уверен, что это лучшая практика, и даже если в C# есть что-то подобное. Каков наилучший способ сделать это?

ответ

4

Вот site, который, я думаю, удовлетворит то, что вам нужно.

В нем есть пример использования индикатора выполнения и рабочего фона (с использованием BackgroundWorker.RunWorkerAsync()).

+0

Я рассмотрел учебник в ответе Скотта Чемберлена вместо этого, потому что этот сайт не упоминает свойство «WorkerReportsProgress» класса «BackgroundWorker», которое абсолютно критично и должно быть настроено на «Истину», чтобы отчеты о ходе работы работали. –

+2

Разве не вопрос о показе prograssbar в модальном окне? –

6

Лучший способ в C# - использовать BackgroundWorker и выполнять интенсивную операцию внутри этого рабочего.

Here is a tutorial, который включает инструкции о том, как отменить операцию на полпути.

-1

В C# вы можете позвонить Thread.Sleep(0) или Thread.Sleep(1), чтобы сделать то же самое, что и Java Thread.Yield().

С учетом этого вам определенно нужно будет сделать свой SaveState() в отдельной теме. Имейте переменную в своей SaveState() функции, которая обновляется, как SaveState() прогрессирует. Поместите таймер в свою модальную форму прогресса и попросите таймер проверить эту переменную, которую обновляет SaveState(). Обновите свой индикатор выполнения

+2

Это правда, что 'Thread.Sleep (0)' даст текущий поток, но вам нехорошо, если ваш пользовательский интерфейс работает в одном потоке. У .NET Framework есть 'Application.DoEvents()', чтобы по существу перейти к одному проходу цикла конвейера сообщений, но использование «BackgroundWorker» является очень предпочтительным. –

-1
ProgressBar p = new ProgressBar(); 
p.Location = new Point(10, 10); 
p.Size = new Size(100, 30); 
p.MarqueeAnimationSpeed = 30; 
p.Style = ProgressBarStyle.Marquee; 
Смежные вопросы