Witam
W jaki sposób przekazać z BackgroundWorkera informacje identyfikującą dany wątek po wywołaniu CancelAsync() ?
(e.Result daje null). Pod RunWorkerCompleted podpiętych jest kilka różnych BackgroundWorker'ów.
Witam
W jaki sposób przekazać z BackgroundWorkera informacje identyfikującą dany wątek po wywołaniu CancelAsync() ?
(e.Result daje null). Pod RunWorkerCompleted podpiętych jest kilka różnych BackgroundWorker'ów.
Możesz sobie porównać argument sender
z listą twoich background workerów czy w jaki tam sposób sobie je identyfikujesz.
Mam 2 klasy
public class A : Net
{
}
public class B : Net
{
}
i klasę bazową
public class Net
{
private BackgroundWorker bw;
public event RunWorkerCompletedEventHandler RunWorkerCompleted;
public event ProgressChangedEventHandler ProgressChanged;
public BackgroundWorker Bw
{
get { return bw; }
}
public Net()
{
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
public void Start(RequestState rs)
{
if (!bw.IsBusy)
{
bw.RunWorkerAsync(rs);
}
}
public void Cancel()
{
if (bw.WorkerSupportsCancellation)
{
bw.CancelAsync();
}
}
//reszta kodu pominięta
}
i teraz tworzę sobie dwa obiekty
private A ANet = new A();
private B BNet = new B();
podczepaim zdarzenia do wspólnej procedury
ANet.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Net_RunWorkerCompleted);
BNet.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Net_RunWorkerCompleted);
void Net_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (sender == ANet.Bw)
{
//warunek prawdziwy - patrz opis niżej
}
}
Tu mam mały problem:
Uruchamiam ANet.Start, i dla celów testowych daję BNet.Cancel w Net_RunWorkerCompleted
sender wskazuje na ANet. BNet.Cancel na pewno zatrzymuje pobieranie.