Wszystko, tutaj jest pytanie o projekt/najlepsze praktyki złożonego przypadku anulowania Zadanie: s w języku C#. Jak wdrażasz anulowanie udostępnionego zadania?Jak zaimplementować anulowanie współdzielonego zadania: s w C#
Jako minimalny przykład przyjmijmy następujące; mamy długotrwałą, wspólnie odwoływaną operację "Praca". Akceptuje token odwołania jako argument i wyrzuca, jeśli został anulowany. Działa na pewnym stanie aplikacji i zwraca wartość. Jego wynik jest niezależnie wymagany przez dwa składniki interfejsu użytkownika.
Podczas gdy stan aplikacji pozostaje niezmieniony, wartość funkcji Praca powinna być buforowana, a jeśli jedno obliczenie jest w toku, nowe żądanie nie powinno rozpoczynać drugiego obliczenia, lecz raczej czekać na wynik.
Każdy z komponentów interfejsu użytkownika powinien mieć możliwość anulowania jego zadania bez wpływania na inne zadania komponentów interfejsu użytkownika.
Jesteś ze mną do tej pory?
Powyższe można osiągnąć, wprowadzając pamięć podręczną zadań, która opakowuje rzeczywiste zadanie robocze w TaskCompletionSources, którego zadania: s są następnie zwracane do składników interfejsu użytkownika. Jeśli składnik interfejsu użytkownika anuluje zadanie, porzuci tylko zadanie TaskCompletionSource, a nie podstawowe zadanie. To wszystko jest dobre. Składniki interfejsu użytkownika tworzą źródło anulowania, a żądanie anulowania to normalny projekt z góry do dołu, a współdziałające zadanie TaskCompletionSource znajduje się na dole.
Teraz, na prawdziwy problem. Co zrobić, gdy zmienia się stan aplikacji? Załóżmy, że posiadanie funkcji "Praca" działa na kopii stanu, jest niewykonalne.
Jednym z rozwiązań byłoby słuchanie zmiany stanu w pamięci podręcznej zadań (lub około). Jeśli pamięć podręczna ma Token Anulowania używany przez zadanie podstawowe, ten, który uruchamia funkcję Praca, może go anulować. Mogłoby to następnie spowodować anulowanie wszystkich dołączonych zadań TaskCompletionSources: s, a zatem oba składniki interfejsu użytkownika otrzymałyby anulowane zadania. Jest to rodzaj anulowania oddolnego.
Czy jest to preferowany sposób na zrobienie tego? Czy istnieje wzorzec projektowy, który opisuje je w niektórych miejscach?
Odwołanie od dołu można zastosować, ale wydaje się nieco dziwne. Zadanie UI jest tworzone z Tokenem Anulowania, ale jest anulowane z powodu innego (wewnętrznego) Tonu Anulowania. Ponadto, ponieważ tokeny nie są takie same, wyjątek OperationCancelledException nie może być po prostu ignorowany w interfejsie użytkownika, co może doprowadzić do sytuacji, w której wyjątek zostanie zgłoszony w zewnętrznym finalizatorze zadań.
Doskonałe pytanie, chociaż moja pierwsza reakcja była "tl; dr" – dtb
Tak więc, aby wyjaśnić; masz dwóch konsumentów wyniku zadania, a chcesz tylko jedno zadanie, aby obliczyć wartość na stan aplikacji; mimo to chcesz, aby każdy konsument mógł "anulować" oczekiwanie na wynik zadania? – Tejs
tak, ale także, że zmiana stanu powinna anulować obliczenia. – 4ZM