Witam,
mam następujący problem. Mam program napisany w WPF i w jednej z jego części ma się wykonać 5 metod.
M1, M2, M3, M4, M5
Każda z tych metod wykonuje się jakiś czas z powodu zadania jakie wykonuje (zapisy do plików,do bazy, czytanie z bazy itd)
M1 - 2s, M2 - 1s, M3 - 7s, M4 - 3s, M5 - 1s
co w sumie daje 14s. Trochę długo tym bardziej że aplikacja na ten czas się zamraża.
Użyłem do rozwiązania tego problemu tasków i mój kod wygląda tak:
Task.Run(() => M1());
Task.Run(() => M2());
Task.Run(() => M3());
Task.Run(() => M4());
Task.Run(() => M5());
return wynik;
Wszystko było dobrze do momentu aż aplikacja się rozrosła po zakończeniu tych tasków musi być zwracany status operacji w zależności o parametrów wejściowych, niestety działa to tak że taski wykonują się szybko ale jeszcze zanim się zakończą to wykonuje się mój result.
Następnie dodałem do tego await a końcowo mój program wyglądał tak:
await Task.Run(() =>
{
Task.WaitAll(
Task.Run(() => M1()),
Task.Run(() => M2()),
Task.Run(() => M3()),
Task.Run(() => M4()),
Task.Run(() => M5())
);
});
return wynik;
Nie wiem na ile to jest poprawnie ale kod działał jak chciałem. Do czasu aż w metodzie M3 został znów zastosowany nowy async/await i wszystko legło w gruzach bo już nie działał mi Task.WaitAll();
Czy jest jakiś lepszy i poprawny sposób na rozwiązanie takiego problemu?
Dodam jeszcze że mam parę zmiennych globalnych które tworzą mi się w konstruktorze i metody M1 do M5 ich używają, te parametry też sa modyfikowane lub nadpisywana przez te metody. I metody M1 do M5 używają wspólnych metod helperowych do obliczeń - z tego powodu w srodku używam także async/await i nowych tasków.