Форма с 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);
}