Witam. Pisze aplikacje sluzaca do rozwiazywania pewnego problemu optymalizacyjnego. Mam kilka zaimplementowanych algorytmow oraz gui (WinForms), w ktorym odpalam kilka z tych algorytmow roznolegle, one z kolei updatuja progress bary itd. Wykorzystuje do tego metode Parallel.For, ale ma ona jedna wade. Mianowicie przy cancelowaniu Fora, taski ktore juz sa "w uzyciu" kontunuuja swoje dzialanie, co mi nie bardzo odpowiada. Chodzi o to, ze skoro znalezione rozwiazanie satysfakcjonuje uzytkownika, powinien on miec mozliwosc anulowania wszystkich obliczen i zwolnienia CPU. Moj kod wyglada w uproszczeniu tak:
czesc zwiazana z gui:
Task.Factory.StartNew(() =>{ Parallel.For(0, iterations, i =>
{
Worker worker = new Worker(ReportProgress, guiHandler);
worker.run(i);
});
});
metoda optymalizujaca (osobna klasa):
public Worker(StatusReporter reportProgress, guiHandler guiHandler)
{
this._guiHandler = guiHandler;
this._reportProgress = reportProgress;
}
public void run(Object threadContext)
{
int threadIndex = (int)threadContext;
int seed;
lock (syncLock)
{
seed = rnd.Next(100, 500);
}
_guiHandler("create", threadIndex, seed);//updating gui
for (int i = 0; i < seed; i++)
{
System.Threading.Thread.Sleep(100);
_reportProgress(threadIndex, i); //updating progress bars
}
_guiHandler("delete", threadIndex, seed);//updating gui
}
Potrzebuje pomocy w znalezieniu jakiegos fajnego mechanizmu aby powiadomic metody run() o tym, ze uzytkownik nacisnal Cancel i trzeba skonczyc działanie