await/await, wykonywanie równoległe metod.

0

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.

2

To chyba będzie działać:

var tasks = new List<Task>();
tasks.Add(Task.Run(() => M1()));
tasks.Add(Task.Run(async () => await M2()));
tasks.Add(Task.Run(() => M3()));

await Task.WhenAll(tasks.ToArray()); 

M2() to metoda wykonująca się asynchronicznie.

0

Super thx,
to rozwiązało mój problem, rozumiem że tak każdą M mogę zrobić asynchronicznie.

Wszystko trwa nadal około 14s (powiedziałbym że nawet trochę wolniej niż wcześniej)
Pojawił się kolejny problem, który wydaje mi się że wygląda tak:
Metody te korzystają z tych samych metod (helperowych), i wygląda to tak jakby czekały między sobą aż któraś skończy korzystać z metody współdzielonej temu czas się wydłuża. Te metody też powinny być async?

0

Bez kodu albo chociaż informacji co robią te metody „helperowe” trudno odpowiedzieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1