WPF, ProgressBar, BackgroundWorker

10/08/2008 - 19:59 von Wojtek Kusch | Report spam
Hallo!
Ich möchte eine ProgressBar zur Anzeige des Fortschrits bei einer
zeitlich aufwendigen Operation einsetzen. Damit die ProgressBar
upgedatet wird, setze ich einen ProgressWorker ein:




worker = new ProgressWorker(progressBar);
worker.Start();
Finder finder = new Finder (requestList, textBox1.Text, textBox2.Text);

finder.Find();
worker.Cancel();





Ich übergebe dem "worker" die ProgressBar, aber diese wird nicht
upgedatet -kein Wunder, denn "ProgressChanged" wird nicht aufgerufen.
Kommentiere ich aber zeituintensive Teile aus der Methode
"finder.Find()" wird die ProgressBar upgedatet...
Muss ich "Find()" auch im eigenen Thread laufen lassen, oder warum gibt
es dieses Verhalten?
Vielen Dank für die Hilfe!
Wojtek



Und hier die Klasse ProgressWorker:

class ProgressWorker
{
private BackgroundWorker _worker;
private ProgressBar progressBar;

public ProgressWorker(ProgressBar progressBar)
{
this.progressBar = progressBar;
}


public void Start()
{
_worker = new BackgroundWorker();
_worker.WorkerReportsProgress = true;
_worker.WorkerSupportsCancellation = true;


_worker.ProgressChanged += delegate(object s,
ProgressChangedEventArgs args)
{
progressBar.Value = args.ProgressPercentage;
};

_worker.RunWorkerCompleted += delegate(object s,
RunWorkerCompletedEventArgs args)
{
progressBar.Value = 0;
};


_worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
BackgroundWorker worker = s as BackgroundWorker;
for (int i = 0; i < 10; i++)
{
if (worker.CancellationPending)
{
args.Cancel = true;
return;
}
Thread.Sleep(1000);
worker.ReportProgress(i + 1);
}
};



_worker.RunWorkerAsync();

}

public void Cancel()
{
_worker.CancelAsync();
}



}
 

Lesen sie die antworten

#1 Frank Dzaebel
10/08/2008 - 20:40 | Warnen spam
Hallo Wojtek,

ist das Excel Problem für Dich gelöst?
Wenn ja, kurzes Feedback ist gern gesehen.


worker = new ProgressWorker(progressBar);
worker.Start();
Finder finder  = new Finder (requestList, textBox1.Text, textBox2.Text);
finder.Find(); worker.Cancel();



Wenn der obige Code im UI-Thread làuft, blockiert
natürlich der "Finder" ganz normal die GUI, wenn er
keine Methode in einem anderen Thread aufruft.
Der "Finder" müsste normal in das DoWork-Delegate.

Wir wissen nicht wie weit die Funktionalitàt
separiert sein soll, aber er kann natürlich auch in
einem zusàtzlichen Thread laufen, wobei Du dann
aber noch ggf. die Cancel-Aktion synchronisieren musst.

[Threadsynchronisierung (C#-Programmierhandbuch)]
http://msdn.microsoft.com/de-de/lib...73179.aspx

[Erweiterte Synchronisierungsverfahren]
http://msdn.microsoft.com/de-de/lib...8dte8.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen