Kontynuując temat z poprzedniego wpisu, obecnie przedstawię, w jaki sposób wypełnić plik, aby odpowiadał obrazowi pamięci oczekiwanemu przez aplikacje nie napisane w .NET (napisane w kodzie niezarządzanym). W tym wypadku swoją rolę ponownie odegrają klasy BitConvert oraz Encoding. W obu wypadkach użyte zostaną metody o takiej samej nazwie: GetBytes...
Sztuka programowania 4542 dni, 15 godzin, 54 minuty temu 84 źrodło rozwiń
Dziś po długim wprowadzeniu teoretycznym, mającym na celu wyjaśnienie “zaawansowanych” mechanizmów synchronizacji czas przyszedł na pokazanie pierwszej struktury danych. Przed pojawieniem się asynchronicznych kolekcji, najczęściej korzystało się z prostego lock’a jak:lock(_Sync) { _list.Add(newElement); } Rozwiązanie mało wygodne i przede wszystkim niewydajne. Nowe kolekcje zawierają mechanizmy synchronizacji omówione w poprzednich postach takie jak:SpinLock SpinWait SemaphoreSlim CountdownEvent ...
Sztuka programowania 4544 dni temu 163 źrodło rozwiń
Jak wiadomo wszystkie dane platformy .NET są przechowywane w postaci obiektów [...], więc siłą rzeczy sposób przechowywania tychże danych jest ukryty przed programistą (obiekty są wszak hermetyczne). Jest to całkowicie odmienne podejście do przechowywania danych w stosunku do stosowanego przed erą .NET. Tam typy proste były zwyczajnie obszarem pamięci, który był odpowiednio interpretowany przez oprogramowanie (dbał o to kompilator)...
Sztuka programowania 4546 dni, 16 godzin, 25 minut temu 132 źrodło rozwiń
W dzisiejszym wpisie zajmę się tematem śledzenia zmian i kontroli danych w obiekcie DataTable. Jest to możliwe dzięki temu, że wiersze tabeli będące obiektami typu DataRow przechowują informacje o swoich wersjach. Obiekty DataRow posiadają także szereg metod związanych z modyfikacją danych, a co za tym idzie ze zmianą ich wersji.
W ostatnim poście pisałem o różnych mechanizmach opartych o Spin. Zachęcam do przejrzenia ostatnich wpisów ponieważ bez tego trudno będzie zrozumieć dzisiejszy post. SpinWait jest strukturą, w której najważniejsza metoda to SpinOnce. SpinOnce przez pierwsze 10 wywołań wykonuje klasyczny Spin (patrz poprzednie posty) dzięki czemu nie musimy obawiać się koszty związanego z uśpieniem wątku, zmianą kontekstu itp. SpinOnce jest jednak na tyle inteligentny, że po 10 wywołaniach zmienia swoje zachowanie:Po 10...
Programowanie rozproszone 4549 dni, 17 godzin, 37 minut temu 54 źrodło rozwiń
Dziś kolejny mechanizm potrzebny do zrozumienia struktury SpinWait, którą opiszę w następnym poście. Thread.Yield oddaje wątek z powrotem do CPU. Wywołanie mówi, że nie mam nic więcej do roboty i jeśli CPU ma coś lepszego do zrobienia to niech to zrobi a po tym dopiero wątek macierzysty zostanie wznowiony. Innymi słowy jeśli wątek A wywołuje Thread.Yield wtedy CPU zawiesza go, wykonuje inny i potem z powrotem powraca do wątku A. Jednak należy zaznaczyć, że w przypadku Yield, może zostać wybrany wątek wył...
Sztuka programowania 4552 dni, 12 godzin, 51 minut temu 141 źrodło rozwiń
Dziś kolejny post z ostatniego cyklu o o wielowątkowości. Myślę, że Thread.Sleep jest znany każdemu – służy po prostu do uśpienia wątku. Na przykład:
Sztuka programowania 4554 dni, 10 godzin, 33 minuty temu 161 źrodło rozwiń
Przechodząc na język C#, chcąc nie chcąc programuje się zgodnie z wyrobionych dotąd stylem i wg starych przyzwyczajeń. Niemniej, staram się weryfikować, czy obrana droga rzeczywiście jest tą, z której należy korzystać na nowym terenie, jakim jest C#. Dotąd często korzystałem z możliwości domyślnych parametrów, tak w konstruktorach, jak i w metodach (procedurach i funkcjach). Ostatnio mój kolega zauważył, że C# do konstrukcji klas nie używa konstruktorów z domyślnymi parametrami...
Sztuka programowania 4555 dni, 8 godzin, 54 minuty temu 131 źrodło rozwiń
Ponad dwa lata temu, popełniłem wpis na temat operacji na kolekcjach w C#. Post ten ku mej uciesze, wciąż cieszy się sporą popularnością, dlatego też postanowiłem napisać niejako jego kontynuację. Gdy dwa lata temu pisałem tamten wpis, wciąż dominującą wersją frameworka .Net, była ta oznaczona wersją 2.0. Dziś sytuacja się trochę zmieniła i przynajmniej w moim odczuciu, coraz więcej osób korzysta z wersji 3.5 i 4.0, a na horyzoncie jest już .Net 4.5, który pojawi się w pełni wraz z Windowsem 8 i Visual ...
Architektura 4556 dni temu 296 źrodło rozwiń
W ostatnich postach opisuje różne mechanizmy synchronizacji w c#. Jak widać, jest tego na prawdę wiele i sama znajomość słowa lock nie wystarcza jeśli poważnie myśli się o algorytmach współbieżnych. Dziś kolejna metoda synchronizacji a mianowicie klasa CountdownEvent. Ostatnie posty oprócz wprowadzenia do wspomnianych klas stanowią wstęp do kolekcji współbieżnych, które zamierzam omówić wkrótce. Konstruktor CountdownEvent przyjmuje liczbę całkowita (zwykle większą od 0), która stanowi wartość początkową...
Sztuka programowania 4556 dni, 11 godzin, 49 minut temu 113 źrodło rozwiń
Dziś krótki post o ciekawej konwersji, która ma miejsce podczas przekazywania delegat. Rozważmy kod
Dziś kolejny post o synchronizacji w c#. Semafor to bardzo popularna forma limitowania liczby wątków, które mogą mieć dostęp do danego kodu. Nie chcę omawiać tutaj podstaw semafora, ale myślę, że warto przypomnieć ogólną zasadę. Pseudokod (źródło Wikipedia):procedure V (S : Semaphore); begin (* Operacja atomowa: inkrementacja semafora *) S := S +1; end; (* Operacja atomowa: dekrementacja semafora ) procedure P (S : Semaphore); begin ( Cała operacja jest atomowa *) repeat Wait()...
Sztuka programowania 4563 dni, 9 godzin, 32 minuty temu 266 źrodło rozwiń
W .NET istnieje wiele sposobów synchronizacji pracy wątków. O dużej części z nich pisałem już na blogu (z ciekawszych np. klasa Barrier ). Najpopularniejszym i najłatwiejszym sposobem jest użycie słowa kluczowego lock. W wielu przypadkach jest to najlepszy i najbezpieczniejszy wybór. SpinLock to zupełnie inne podejście. W przypadku lock, wątek jest usypiany i budzony gdy przyjdzie na niego kolej. Ma to kilka poważnych wad. Wiążą się one z szeregowaniem oraz zmianą kontekstu. Zmiana kontekstu jest dość c...
Na platformie .NET od wersji 3.5 dostępna jest technologia LINQ oferująca uniwersalny mechanizm zadawania zapytań do obiektów. W tym wpisie pokażę w jaki sposób przy użyciu LINQ to XML przenieść dane z kolekcji obiektów do dokumentu XML, wczytać dane z pliku XML do kolekcji oraz zmodyfikować zawartość XML-a.
W .NET 4.0 wprowadzoną klasę Tuple służącą do owijania kilku wartości w jeden obiekt. Tuple to nic innego jak obiekt zawierający w sobie jakieś dane w postaci właściwości. Do dyspozycji jest 8 statycznych metod służących do stworzenia Tuple:Create(T1)Create(T1,T2)Create(T1,T2,T3)Create(T1,T2,T3,T4)Create(T1,T2,T3,T4,T5)Create(T1,T2,T3,T4,T5,T6)Create(T1,T2,T3,T4,T5,T6,T7)Create(T1,T2,T3,T4,T5,T6,T7,T8) Ponadto istnieje możliwość stworzenia tuple za pomocą jednego z konstruktorów:Tuple
Posted by slanto on Zastosowanie wzorca Decorator na przykładzie produktu i ofert specjalnych. Wzorzec ten pozwala nam na dynamiczną zmianę/rozszerzanie zachowania istniejących klas.
Architektura 4572 dni, 22 godziny, 25 minut temu 290 źrodło rozwiń
When working with multi threaded applications, we tend to spawn worker threads which can lead to ineffective code when not done correctly, for example threads will not get reused and will be recreated for each work items. The solution to all those problems is a ThreadPool which reuses threads and queues work items that are consumed by those threads. This sort of implementation while simple can have side effects as unless the pool Queue is immutable it will have to be locked each time an item Enqueued and...
Często spotykanym wyzwaniem przy budowie systemów rozproszonych jest przesyłanie plików o znacznych rozmiarach. Tego typu rozwiązanie w łatwy sposób można zaimplementować w technologii WCF, która pozwala na tworzenie wszechstronnych i wydajnych usług sieciowych. Na przykładowym serwisie WCF pokażę w jaki sposób radzić sobie z wysyłaniem i odbieraniem dużych plików pomiędzy klientem a usługą.
Programowanie rozproszone 4574 dni, 21 godzin, 21 minut temu 412 źrodło rozwiń
W dzisiejszym poście o dwóch nowościach. Pierwsza z nich to ulepszona kompatybilność. W VS 11 można otwierać solucje utworzone w Visual Studio 2010 bez znanego “Upgrade”. Oznacza to, że można jednocześnie na tym samym projekcie pracować zarówno w VS 11 jak i VS 2010. Projekt otworzony w VS 11 nie powoduje zmiany formatu i później wciąż może być otwierany w VS 2010. Moim zdaniem znaczącą ułatwia to migrację. Niestety projekt utworzony od nowa w VS 11 nie może być już otwarty w 2010 ale wydaje się to natu...
Piotr Zieliński na swoim blogu rozważał zasadność redefiniowania przez klasy dziedziczące metod z klas dziedziczonych (przy pomocy modyfikatora new), warto zapoznać się z tym wpisem przed kontynuowaniem lektury niniejszego tekstu. Na zakończenie Piotr poprosił o podanie innych, od przestawionych przez niego, powodów, na zasadność użycia modyfikatora new. Oto jeden z nich...
Architektura 4575 dni, 18 godzin, 34 minuty temu 160 źrodło rozwiń