Thread.Abort - jak to poprawnie zrobić.

dział ogólny

Thread.Abort - jak to poprawnie zrobić.

Nowy postprzez Slynx » środa, 25 września 2013, 02:39

Pomimo, że będę posługiwał się językiem C# jest to pytanie głównie teoretyczne.

Cóż - skończyłem pisać element odpowiedzialny za długotrwałe operacje na wątku (kilka(naście) minut). Jak się zorientowałem po skończeniu nie pomyślałem o jednej rzeczy - anulowanie, czyli jak to poprawnie przerwać gdy użytkownikowi się "znudzi".
Najprostszym rozwiązaniem jest oczywiście wywołanie metody Abort() na wątku, która kolejno wywołuje wyjątki ThreadAbortException do czasu, aż nie wyjdzie z wątku. Jednak - jak wiadomo, takie rozwiązanie powoduje sporo kłopotów gdy wyjątek wystąpi w bardzo niepożądanym miejscu (pomijam uchwytu do plików, itp - bardziej chodzi mi o różne funkcje wywoływane na wątku, które kontrolują poprawne zakończenie różnych etapów pracy).
Więc... takie rozwiązanie odrzuciłem na chwilę na bok. Standardowo po poszukiwaniach w internecie wiele osób potwierdza za najlepsze rozwiązanie ustawiania flagi, która jest sprawdzana w miejscach kluczowych. Rozwiązanie stosunkowo dobre - przynajmniej w teorii. Przy próbie zaimplementowania zobaczyłem, że takich kluczowych miejsc na tym wątku jest dużo i wszędzie trzeba by wstawiać takie sprawdzanie flagi (jest dużo operacji trwających po kilka sekund - użytkownik nie powinien czekać tyle czasu na przerwanie pracy). Po teoretycznym oflagowaniu (za pomocą komentarzy) zorientowałem się, że kod ulegnie znacznemu wydłużeniu - pomijam fakt, że to "źle" wygląda gdy czytasz taki kod.

To mi też nie odpowiadało, więc postanowiłem ponownie przyjrzeć się funkcji Thread.Abort(). Jak wspomniałem, jest to proste w użyciu, ale ze względu na fakt, że kod może być przerwany w dowolnym momencie jest to niebezpiecznie. Szukałem różnych sposobów na "zapewnienie wykonania kodu", tak by nie został przerwany - blok try-finally, ale to też miało swoje konsekwencje i ograniczenia, które zmusiły mnie do wycofania tego rozwiązania.

Ostatecznie jestem w kropce, bo nie wiem jak sobie z czymś takim poradzić - ani jedno ani drugie rozwiązanie tak na prawdę mi nie odpowiada, ze względu na swoje skutki, dlatego chciałem zapytać kogoś bardziej doświadczonego, jak się coś takiego powinno robić ?

Gdybym teraz nie otrzymał żadnej odpowiedzi to zapewne spróbowałbym ustawiać flagi pomiędzy długotrwałymi funkcjami, a do tych wykonujących się dłużej dopisał metody anulujące, które byłyby wykonywane w "funkcji Stop()".
Jednak zanim zacznę grzebać w kodzie (co nie potrwałoby 5 minut) wolę się upewnić, że będę robił to poprawnie.

Zaprojektowałem wszystko samemu od początku do końca, a o czymś tak banalnym nie pomyślałem <facepalm> (Wiem, że nie ma takiej emotki, ale nie potrafię tego lepiej podsumować...)
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Thread.Abort - jak to poprawnie zrobić.

Nowy postprzez polymorphism » środa, 25 września 2013, 09:21

Krótko: opcja z flagą.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości