Я застрял в проблеме, когда я использую Backgroundworker, чтобы показать ход моей работы в индикаторе выполнения. Код, используемый для BackgroundWorker: -Как использовать progressbar, backgroundworker, windows form вместе в C#?
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(200);
for (int i = 0; i <= 100; i++)
{
Delegate del= new DELEGATE(simulateHeavyWork);
this.Invoke(del);
backgroundWorker1.ReportProgress(i);
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
backgroundWorker1.ReportProgress(0);
return;
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
percentLabel.Text = e.ProgressPercentage.ToString() + "%";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Cancelled");
}
else
{
MessageBox.Show("Completed");
}
}
Я создал делегат по коду: -
public partial class Form1 : Form
{
private delegate void DELEGATE();
public Form1()
{
InitializeComponent();
}
private void simulateHeavyWork()
{
Thread.Sleep(100);
...lines of code to perform some search logs operation..
....
}
}
Функциональность Я хочу добиться того, что прогресс бар должен сообщить о достигнутом прогрессе моей функции simulateHeavyWork() который фактически использует поток пользовательского интерфейса, так как он должен принимать данные от моих элементов управления формой и обновлять их.
Теперь проблема заключается в том, что: - a) код на самом деле вызывает simulateHeavyWork() и дает выходные данные, которые обновляют элементы управления ui и выполняются работы. (Примечание: я использовал делегат здесь, чтобы избежать ошибки. элементы управления, работающие на нити ui, поскольку моей функции необходимо использовать элементы управления пользовательским интерфейсом.)
Как только это будет сделано, он начнет обновлять индикатор выполнения, а это неправильно и выглядит так, как будто он вызывает симуляциюHeavyWork снова и снова с разрывом сна (100) ,
Пожалуйста, помогите !!! С уважением
Очень странный подход. Фоновые потоки, как правило, необходимы для предотвращения замораживания UI при длительных операциях. Так что бегущий фоновый поток и сразу вызывающий его делегат для запуска в потоке пользовательского интерфейса (и его замораживание) выглядит странно для меня. –
yep, но я не мог найти другого простого способа сделать это, я хочу показать индикатор выполнения и позволить пользователю отменить операцию. Проблема в том, что работа с длительным сроком действия на самом деле использует элементы управления ui, такие как кнопка формы, где пользователь вводит данные, такие как id, описание даты и т. Д., И запрашивает подсчет этого числа в журналах, которые должны снова отображаться в форме. – user3222101
Ну, может быть, будет лучше разделить вашу логику - таким образом, оставить в фоновом режиме долговременные вычисления и обновить элементы пользовательского интерфейса в обработчике 'ProgressChanged'? –