Форма с 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д