Witam
Mam długo wykonującą się metodę:
class LongMethodClass{
public void longMethod(){
}
}
W jaki sposób użyć klasy BackgroundWorker i metody ReportProgress bez ingerencji w klasę LongMethodClass?
Witam
Mam długo wykonującą się metodę:
class LongMethodClass{
public void longMethod(){
}
}
W jaki sposób użyć klasy BackgroundWorker i metody ReportProgress bez ingerencji w klasę LongMethodClass?
Nie da się.
A jest jakiś inny sposób na raportowanie takiej metody??
Tylko stany "wykonane", "niewykonane". Ew. możesz obliczać czas wykonywania tej metody i podawać średnią wartość. No, ale to niezbyt dobry pomysł.
A dlaczego nie możesz zmodyfikować tamtej metody? Jest w jakiejś innej bibliotece? Jeżeli jest w miarę prosta i jej licencja na to pozwala, możesz zdekompilować Reflectorem kod tej metody i przenieść jej ciało do własnej, z dodaną obsługą raportowania jej stanu.
Chcesz użyć wielowątkowości bez żadnych zmian. Nie ma tak łatwo ;)
Ale z drugiej strony nie ma też w tym nic trudnego.
Zobacz przykładową klasę:
public class Slave : BackgroundWorker
{
protected override void OnDoWork(DoWorkEventArgs e)
{
base.OnDoWork(e);
LongMethod();
}
private void LongMethod()
{
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
//work
}
ReportProgress(i);
}
}
}
Tworzysz potem instancję klasy, odpalasz i tylko czekasz aż się wykona ;)
Ale chodzi przecież o to, żeby nie modyfikować metody LongMethod, nie możesz umieścić tam żadnego ReportProgress.
No tak - masz rację. Jeśli na pewno nie może jej zmodyfikować, to nie da się w łatwy sposób raportować postępu. Ale może bez problemu uruchomić ją w tle. ;)