W .NET można anulować wątki za pomocą tokena. Oczywiście nie należy używać metody Abort czy Cancel, ale o tym już wiele razy pisałem – w skrócie nie wiadomo kiedy taki wątek zostanie przerwany. Użycie tokena jest proste tzn. (przykład MSDN):class Program { staticvoid Main() { var tokenSource2 =new CancellationTokenSource(); CancellationToken ct = tokenSource2.Token; var task = Task.Factory.StartNew(() => { // Were we already canceled? ct.T...
Sztuka programowania 4015 dni, 3 godziny, 23 minuty temu 140 źrodło rozwiń
Tydzień temu w pierwszym poście poświęconym synchronizacji, przedstawiłem Wam trzy kluczowe zagadnienia związane z tym tematem. I choć lock, Monitor oraz Mutex pozwalają nam rozwiązać naprawdę dużą liczbą problemów dotyczących wielowątkowości, to warto wiedzieć, że jest to tylko część programistycznego orężu w jaki wyposażył nas Microsoft. Dziś chciałbym Wam przedstawić cztery kolejne klasy, które powinny uzupełnić temat rozpoczęty tydzień temu i zasadniczo wyczerpać kwestię synchronizacji. Bez zbędnego ...
Architektura 4452 dni, 4 godziny, 19 minut temu 349 źrodło rozwiń
Kilka dni temu zainicjowałem cykl postów związanych z wielowątkowością. Rozpocząłem dość standardowo, bo od wyjaśnienia istoty tego zagadnienia i przedstawienia prostych wątków. Wiedza zawarta w tamtym wpisie, powinna w wielu przypadkach okazać się wystarczająca - szczególnie jeśli w naszej aplikacji mamy tylko jeden wątek dodatkowy, który stworzony jest tylko po to by odciążyć wątek główny. Takie proste rozwiązanie nie będzie jednak zawsze do końca wystarczające. Problemy pojawią się w sytuacji gdy wąt...
Architektura 4459 dni, 1 godzinę, 36 minut temu 353 źrodło rozwiń
Napiszemy prosty program wielowątkowy, zrobimy synchronizację z głównym wątkiem (aby czekał dokładnie do momentu zakończenia drugiego wątku) i dodatkowo prześlemy parametr do nowo tworzonego wątku. To wszystko jest często niezbędne w aplikacjach i warto wiedzieć jak to się robi. Poprzednio wątki synchronizowane były za pomocą zmiennej bool. Nie jest to dobre rozwiązanie. Dodatkowo wątek główny musiał sprawdzać co pewien czas wartość tej zmiennej. Tutaj rozwiążemy to nieco bardziej optymalnie. Stw...
Sztuka programowania 4517 dni, 1 godzinę, 40 minut temu 323 źrodło rozwiń
Na różnych forach często użytkownicy mają problem z aktualizacją kontrolek z innego wątku. Załóżmy, że odpaliliśmy sobie BackgroundWorker lub po prostu Thread. Wykonujemy jakieś operację, np. łączymy się ze zdalnymi zasobami. Stworzenie osobnego wątku w takim scenariuszu jest bardzo pożądane ponieważ nie blokujemy wtedy aktualizacji interfejsu. W trakcie pobierania informacji z Internetu chcemy aktualizować interfejs aby informować użytkownika o postępach np.progressBar.Value = progessValue; Jeśli powyż...
Informacja dla tych, którzy chcieliby poczytać o programowaniu wielowątkowym w C# (i dla mnie bym nie musiał kolejny raz „googlać” tego linku) polecam przeczytanie książki „Threading in C#” autorstwa Joseph Albahari.
Programowanie rozproszone 4969 dni, 5 godzin, 16 minut temu 260 źrodło rozwiń
Dziś trochę czystej teorii dla tych, którzy potrzebują wywoływać komponenty COM. W Internecie znajduje się wiele artykułów o różnicach między STA a MTA. Większość jednak opisuje je dosyć szczegółowo uwzględniając wiele aspektów technicznych i przez to nie zawsze może być to zrozumiałe. Podstawy jednak są bardzo proste i w poście skupie się wyłącznie na nich – szczegóły z pewnością znajdziecie na MSDN. Przede wszystkim STA, MTA mają znaczenie wyłącznie gdy korzystamy z obiektów COM. To pozostałość po dawn...
Architektura 5000 dni, 20 godzin, 11 minut temu 80 źrodło rozwiń
Okazuje się, że bardzo prosto, ale zacznijmy od początku. Niedawno zakończyłem pracę nad serwerem zajmującym się wykonywaniem tzw. zadań wsadowych. Definicje zadań do wykonania pobierane są z bazy danych, a w danym momencie może działać wiele serwerów. Każdy serwer rezerwuje sobie swoje zadania na pewien kwant czasu. Po upływie tego czasu inne serwery mają prawo przejąć to zadanie. Może się tak zdarzyć na przykład jeśli jakiś serwer ulegnie awarii. Jeśli wykonanie danego zadania zajmuje w...
Programowanie rozproszone 5005 dni, 23 godziny, 51 minut temu 131 źrodło rozwiń
Używanie wątków przypomina stąpanie po cienkim lodzie: póki jesteśmy na lodzie jest fajnie i zabawnie, w momencie gdy lód pod nami pęka, no cóż, mamy problem. Teraz do rzeczy .. Dostaję do ręki okienko z jakimiś ustawieniami (checkboxy, pola textowe, te sprawy) i magicznym przyciskiem ‘Save’ zapisującym ustawienia do bazy. Żart polega na tym, że po zmianie jakiejś opcji i użycia magicznego przycisku stan kontrolki powraca do stanu sprzed ‘Save’. Niemalże mechanicznie ponawiam czynność i tym razem już wsz...
Uzupełniam ostatnio braki w wiedzy, dotyczące synchronizacji wątków. Gdzieś w podrozdziale dotyczącym tego tematu przykuł moją uwagę Mutex. Mutex to, obok monitorów i semaforów, jedna z “prymitywnych” metod synchronizacji. Ma jednak bardzo ciekawą właściwość, odróżniającą ją od kolegów po fachu…
Architektura 5424 dni, 23 godziny, 4 minuty temu 110 źrodło rozwiń
Wszyscy znamy doskonale funkcję Sleep, która w Windows API służy do zawieszania działania wątku na określony czas (podawany w milisekundach). Wydawałoby się, że musi to być najprostsza funkcja z tego API, jaką tylko można sobie wyobrazić – bo co może być skomplikowanego w “zwykłej pauzie”? A okazuje się, że jak najbardziej może :) Używając Sleep – zwłaszcza w swej zwykłej wersji – musimy bo...
Dzisiejszy wpis to praktycznie dokończenie dwóch poprzednich, stanowiące jakieś ich uzupełnienie, lub też swojsko rzecz ujmując ‘dobicie’. Do zbadania na dziś przygotowałem klasy Timer i BackgroundWorker. Ta druga trochę nietypowo, ponieważ wykorzystana zostanie w ‘aplikacji’ konsolowej, a głównym(tak mi się zdaje) jej zastosowaniem są aplikacje okienkowe i puszczanie złożonych czasowo operacji w tle, by GUI nie zostało ‘zawieszone’. Timer(System.Threading) Tutaj prosto i przyjemnie: jeśli chcemy odpala...
Dzisiaj kontynuacja ostatniego wpisu, traktującego o najprostszych operacjach na wątkach. Bez zbędnych wstępów przejdę więc do klasy ReaderWriterLock. ReaderWriterLock Klasa ta daje możliwość, której nie daje nam klasa Monitor, mianowicie rozróżnianie pomiędzy blokadą do odczytu(umożliwia ona wielu wątkom jednoczesny dostęp do zasobu) oraz zapisu(tylko jeden naraz możliwy, oczywiście wtedy odczyt jest również zablokowany. Aby jej użyć wystarczy instancja ReaderWriterLock w klasie, do której dostęp ma ...
Z racji tego, że moja nauka .NET’a była straszliwie chaotyczna(czytaj jak czegoś potrzebowałem, to doczytywałem, nie zawsze to co trzeba:P) postanowiłem odrobić lekcje z kwestii podstawowych. Na pierwszy ogień jak widać poszły wątki, więc nieco o nich dzisiaj. Tworzenie nowego wątku. Wersja najprostsza: korzystając z klasy ThreadPool i statycznej funkcji QueueUserWorkItem odpalamy funkcję o sygnaturze odpowiadającej:publicdelegatevoid WaitCallback(object arg); Do dyspozycji mamy dwie wersje funkcji, z p...
SyncRoot to właściwość zdefiniowana na poziomie interfejsu ICollection służąca do synchronizowania operacji wykonywanych na kolekcjach przy pomocy słowa kluczowego lock lub jawnie przy pomocy monitora. Czemu jednak należy używać tej właściwości zamiast instancji kolekcji, czyli czemu zalecany jest taki kod: Kiedy postawiłem sobie to pytanie okazało się, że odpowiedź nie jest dla mnie oczywista. Wizyta w dokumentacji MSDN nic nie pomogł...
Ciekawy tekst o związkach między kościołem a programowaniem ;)