Форма с progressbar: Что оптимальнее - поток или backgroundWorker - C#
Формулировка задачи:
Добрый всем день.
Есть класс, который выполняет некую работу:
ну и так далее. Т.е. в прогресс форму (создал визуально, накидал на форму компонентов) передаю как значение лейбла так и параметры прогрессбара
Эта прогрессбар форма виснет. Может ли кто подсказать КАК сделать всё красиво)))? Т.е. чтоб форма могла таскаться по монитору + чтоб я туда кнопку отмены добавил (добавить то добавил, только вот нажать её не удается из-за приоритетов). Правильно ли использовать потоки или всё же backgroundWorker?
... помимо окна есть куча кода. Я же не разрабатываю что то визуальное. Форма, прогрессбар, лейбл - это всё уже есть. Мне же нужно связывание событий, которые происходят в классе с этой формой. И я не могу с этим разобраться. Т.е. передача переменных и параметров из класса (отдельный файл *.cs) в форму, будь то threads, events, backgroundworker, или ещё что. Наверняка есть куча методов, но я с этим сталкиваюсь впервые. Меня интересуют технологии передачи а не что-то визуальное.
Кто-нибудь что-нибудь подскажет??
Спасибо.
public class MyNew : IMyNew { private bool Initialize() { this.InitializeProgressDialog(); return true; } private void InitializeProgressDialog() { this.statusDialog = new ProgressBar(); this.statusDialog.setProgressBarLimit(this.renderCount); this.statusDialog.Show(); } private void CreateControls() { this.statusDialog.updateStatus("Creating Movie Controls", true); } private void CreateView() { this.statusDialog.updateStatus("Rendering Starting View", false); } private void CreateStandardViews() { int[] array; array = new int[] { 7, 1, 4, 2, 3, 1, 5, 6, 9, 8 }; string[] array2 = new string[array.Length]; for (int i = 0; i < array.Length; i++) { this.statusDialog.updateStatus(string.Concat(new object[] { "Rendering Standard Views: ", i + 1, " of ", array.Length }), true); }
public partial class ProgressBar : Form { MyNew Breack; public void setProgressBarLimit(int frameCount) { this.progressBarStatus.Maximum = frameCount + 2; } public void updateStatus(string statusText, bool updateBar) { if (updateBar) { if (this.progressBarStatus.Value < this.progressBarStatus.Maximum) { this.progressBarStatus.Value++; } this.progressBarStatus.Update(); } if (statusText != "") { this.labelSatus.Text = statusText; } this.labelSatus.Update(); } public ProgressBar() { InitializeComponent(); }
Дело в том, что свой класс я тоже вызываю из другого класса. Т.е. схема такая
Класс1->MyNew->Progressbar
Если вызывать класс MyNew в новом потоке, то форма progressbar вообще не отобразится.
Как запихнуть в progressbar непосредственно
backgroundWorker
тоже не пойму, ведь для обновления формы я использую не что-то выполняющееся в DoWork а функцию с параметрамиupdateStatus
и там она уже решает КАК обновлять прогрессбар на форме. Может вообще не тем путем пошел?
Или может иак: вызвать создание формы с прогрессбаром в моём классе, вызвать класс MyNew в отдельном потоке и из него передавать переменные в основной класс и вызывать обновления прогрессбар формы?
Добавлено со слов ТС
Решение задачи: «Форма с progressbar: Что оптимальнее - поток или backgroundWorker»
textual
Листинг программы
for (int i = 0; i < array.Length; i++) { ((BackgroundWorker)sender).ReportProgress(10 + i); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д