Task, Thread - zabicie wątku

0

Witam,
w sieci jest dużo przykładów opisujących anulowanie wątku, np. przez CanncelationToken w taskach. W każdym przykładzie jest jakaś pętla i jej przerwanie.

Potrzebuję przerwać wątek, który nie ma w wykonaniu pętli. W wątku ma zostać wywołana metoda web servie'u, która może się długo wykonywać. Potrzebuję takiego efektu jak w przeglądarce. Otwieram stronę w nowej karcie, zamykam kartę - proces zabity. Proszę o pomoc w rozwiązaniu problemu.

1

Do twojego webserwisu dodaj metodę, która anuluje zadanie. Nazwij ją np. CancelRequest, z parametrem wskazującym który request anulować. Metoda CancelRequest ustawia odpowiednią zmienną - dalej już tak jak zwykle, wątek w webserwisie sprawdza tą zmienną i jeśli jest ustawiona na true, przerywa wykonywanie zadania i zwraca wrartość do klienta.

Nigdy nie powinieneś ubijać wątku na chama. W tym przypadku, przerwiesz wykonywanie metody kiedy trzeba i wątek u klienta tez się zakończy. Ewentualnie, jako ostatnie wyjście awaryjne - jeśli webserwis pomimo żądania nie przerwie wykonywania metody albo nie odpowie, przerywasz wątek u klienta tak jak napisał MSM - ale to ma być sytuacja wyjątkowa, a nie sposób na realizację zadania.

0

Nie wykorzystuje swojego web serwisu tylko klienta.

Sytuacja jest następująca:
powiedzmy, że mam list box na którym jest XX pozycji. Kliknięcie na każdą z tych pozycji powoduje wywołanie metody web serwice która może wykonywać się kilkadziesiąt sekund (wywołanie oczywiście asynchroniczne). Klikam na 20 kolejnych pozycji na liście i uruchamia się 20 kolejnych wątków.

Jak zoptymalizować taką sytuację aby serwer do którego odwołuje się web serwis nie był przeciążony? Nie może zaistnieć sytuacja, w której serwer będzie wykonywał operacje sam dla siebie

0

Skoro nie masz wpływu na webserwis, a nie chcesz żeby poszło na raz 20 żądań do serwera, to kolejkuj żądania u siebie. Tylko nie wiem czy to lepsze, skoro każde wykonuje się 20 sekund. Zresztą, nawet jeśli u siebie zabijesz wątek który wysłał żądanie do serwera, nie masz gwarancji że w tym momencie serwer przerwie wykonywanie operacji, którą rozpocząłeś wysyłając żądanie do niego. Serwer i tak zapewne wykona zadanie do końca jeśli nie udostępniono żadnego mechanizmu umożliwiającego przerwanie operacji, tyle że odpowiedź już nie dotrze do ciebie. Więc, jeśli chodzi o obciążenie serwera to zabijanie wątku w kliencie nie ma za bardzo sensu.

Jeśli webserwis nie potrafi obsłużyć kilku żądań jednocześnie, to problem jest po stronie webserwisu a nie po twojej. Wg mnie niewiele możesz zrobić w tej sytuacji. Z drugiej strony, warto się upewnić czy to rzeczywiście serwerowi wykonanie zadania zajmuje tyle czasu, czy może lagi wynikają z problemów sieciowych i dlatego odpowiedź dostajesz z takim opóźnieniem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.