<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Łukasz Sowa &#187; c#</title>
	<atom:link href="http://lukaszsowa.pl/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://lukaszsowa.pl</link>
	<description>O programowaniu i nie tylko ;)</description>
	<lastBuildDate>Mon, 06 Feb 2012 12:09:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Prosty sposób na uaktualnienie GUI za pomocą BackgroundWorkera</title>
		<link>http://lukaszsowa.pl/2009/08/prosty-sposob-na-uaktualnienie-gui-za-pomoca-backgroundworkera/</link>
		<comments>http://lukaszsowa.pl/2009/08/prosty-sposob-na-uaktualnienie-gui-za-pomoca-backgroundworkera/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 19:56:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[wielowątkowość]]></category>

		<guid isPermaLink="false">/post/2009/08/17/Prosty-sposob-na-uaktualnienie-GUI-za-pomoca-BackgroundWorkera.aspx</guid>
		<description><![CDATA[Podczas pisania aplikacji okienkowych często zdarza się, że nasz program pobiera duże ilości danych, a następnie wyświetla je użytkownikowi. Niezwykle denerwującą sytuacją jest, gdy całość danych wyświetla się &#8222;na raz&#8221;. Jeśli nie &#8222;zamraża&#8221; to interfejsu użytkownika i jeszcze do tego pisze coś w stylu &#8222;Praca w toku&#8221; to jeszcze pół biedy, gorzej jak użytkownik pozostaje [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Podczas pisania aplikacji okienkowych często zdarza się, że nasz program pobiera duże ilości danych, a następnie wyświetla je użytkownikowi. Niezwykle denerwującą sytuacją jest, gdy całość danych wyświetla się &#8222;na raz&#8221;. Jeśli nie &#8222;zamraża&#8221; to interfejsu użytkownika i jeszcze do tego pisze coś w stylu &#8222;Praca w toku&#8221; to jeszcze pół biedy, gorzej jak użytkownik pozostaje z okienkiem z uroczym dopiskiem &#8222;Nie odpowiada&#8221;. Wielkie szanse, że zirytowany taką sytuacją wyłączy naszą aplikację i zgłosi nam błąd &#8211; że nie działa :) Warto jednak zrobić coś jeszcze lepszego, niż zwykłe ostrzeżenie użytkownika, że troszkę poczeka.</p>
<p style="text-align: justify;">Moim zdaniem najlepiej jest wprowadzić do aplikacji pasek postępu (choć nie zawsze jest to możliwe, bo czasem nie wiadomo ile danych przybędzie) i przede wszystkim &#8211; podzielić dane na paczki i prezentować dane progresywnie.</p>
<p style="text-align: justify;"><span style="font-size: medium;"><strong>Jak to zrobić?</strong></span></p>
<p style="text-align: justify;">Najprostszym i przyjemnym sposobem jest użycie klasy BackgroundWorker, ale zacznijmy od początku. W celach demonstracyjnych stworzymy proste okienko, które będzie zawierało ListBox &#8211; do prezentacji wyników, przycisk &#8222;Start&#8221; oraz ProgressBar. Przejdźmy teraz do kodu:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> BackgroundWorker backgroundWorker <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BackgroundWorker<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">const</span> <span style="color: #6666cc; font-weight: bold;">int</span> Results <span style="color: #008000;">=</span> <span style="color: #FF0000;">40</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">const</span> <span style="color: #6666cc; font-weight: bold;">int</span> MaxPartCount <span style="color: #008000;">=</span> <span style="color: #FF0000;">5</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> PartialUpdateWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    InitializeComponent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">//initializing backgroundWorker</span>
    backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">DoWork</span> <span style="color: #008000;">+=</span> backgroundWorker_DoWork<span style="color: #008000;">;</span>
    backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">ProgressChanged</span> <span style="color: #008000;">+=</span> backgroundWorker_ProgressChanged<span style="color: #008000;">;</span>
    backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">RunWorkerCompleted</span> <span style="color: #008000;">+=</span> backgroundWorker_RunWorkerCompleted<span style="color: #008000;">;</span>
    backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">WorkerReportsProgress</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p style="text-align: justify;">Kod chyba jest bardzo wymowny. Tworzymy nową instancję BackgroundWorkera, dla prostoty przykładu ustalamy ile będzie wyników i ile ma liczyć maksymalna paczka danych do wyświetlenia. Następnie przypisujemy odpowiednie zdarzenia &#8211; DoWork &#8211; czyli to co ma zostać wykonane, ProgressChanged &#8211; zdarzenie odpalane w wątku GUI, które wyświetla wyniki, RunWorkerCompleted &#8211; odpalane po zakończeniu DoWork. Ostatnia linijka jest istotna, bo domyślnie ustawiona jest na false i wywołanie ProgressChanged skończy się wyjątkiem. Przejdźmy teraz do implementacji poszczególnych metod.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> startButton_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, RoutedEventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    resultsListBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Items</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    startButton<span style="color: #008000;">.</span><span style="color: #0000FF;">IsEnabled</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
    backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">RunWorkerAsync</span><span style="color: #008000;">&#40;</span>Results<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p style="text-align: justify;">Na początek funkcja podpięta pod przycisk która odpali naszego BackgroundWorkera. Jak widzimy do metody RunWorkerAsync, która uruchamia wątek możemy przekazać opcjonalnie argument. Może być on dowolnego typu i może być tylko jeden. W razie potrzeby, można zawsze przesłać tablicę lub inny kontener.</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> backgroundWorker_DoWork<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, DoWorkEventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">int</span> percentageComplete<span style="color: #008000;">;</span>
    List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> tempResults <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #6666cc; font-weight: bold;">int</span> partsCount<span style="color: #008000;">;</span>
&nbsp;
    var random <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>var i <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;=</span> Math<span style="color: #008000;">.</span><span style="color: #0000FF;">Ceiling</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>e<span style="color: #008000;">.</span><span style="color: #0000FF;">Argument</span> <span style="color: #008000;">/</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">double</span><span style="color: #008000;">&#41;</span>MaxPartCount<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span>random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">500</span>, <span style="color: #FF0000;">1000</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//simulating data fetching</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #008000;">*</span> MaxPartCount <span style="color: #008000;">&lt;=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>e<span style="color: #008000;">.</span><span style="color: #0000FF;">Argument</span><span style="color: #008000;">&#41;</span>
            partsCount <span style="color: #008000;">=</span> MaxPartCount<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//send maximum</span>
        <span style="color: #0600FF; font-weight: bold;">else</span>
            partsCount <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>e<span style="color: #008000;">.</span><span style="color: #0000FF;">Argument</span> <span style="color: #008000;">-</span> i <span style="color: #008000;">*</span> MaxPartCount<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//send remaining</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>var j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span> partsCount<span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            tempResults<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        percentageComplete <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">double</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>i <span style="color: #008000;">*</span> MaxPartCount<span style="color: #008000;">&#41;</span> <span style="color: #008000;">/</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>e<span style="color: #008000;">.</span><span style="color: #0000FF;">Argument</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">*</span> <span style="color: #FF0000;">100</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        backgroundWorker<span style="color: #008000;">.</span><span style="color: #0000FF;">ReportProgress</span><span style="color: #008000;">&#40;</span>percentageComplete, tempResults<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Teraz główna część naszego przykładu, czyli metoda podpięta pod DoWork. W środku tej metody tworzymy pętlę, która przebiega odpowiednią ilość razy (sufit ze wszystkich wyników podzielonych na maksymalna ilość części). Jak widzimy możemy się odwołać do przesłanego argumentu poprzez e.Argument. Musimy jednak stosować rzutowanie, gdyż e.Argument jest typu object (to dosyć oczywiste). W dalszych linijkach generujemy w losowym odstępie czasu po partsCount (równa MaxPartCount albo to co nie zostało jeszcze wysłane) liczb losowych, a także obliczamy procent wykonanej roboty. Kluczową częścią metody jest jej ostatnia linijka, która wywołuje w wątku GUI metodę podpiętą pod ProgressChanged. Do metody tej przekazujemy procent wykonanej pracy oraz znowu mamy opcjonalnie do przekazania jeden argument (ponownie typu object). To umożliwia nam sprytne użycie pozyskanych częściowych wyników &#8211; wysłanie ich do GUI. Dalsza część to już oczywistość:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> backgroundWorker_ProgressChanged<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, ProgressChangedEventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    completeProgressBar<span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> e<span style="color: #008000;">.</span><span style="color: #0000FF;">ProgressPercentage</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var item <span style="color: #0600FF; font-weight: bold;">in</span> <span style="color: #008000;">&#40;</span>List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#41;</span>e<span style="color: #008000;">.</span><span style="color: #0000FF;">UserState</span><span style="color: #008000;">&#41;</span>
        resultsListBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Items</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>item<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> backgroundWorker_RunWorkerCompleted<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, RunWorkerCompletedEventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    startButton<span style="color: #008000;">.</span><span style="color: #0000FF;">IsEnabled</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">W backgroundWorker_ProgressChanged uaktualniamy stan ProgressBara oraz dodajemy pozyskane elementu do ListBoksa. Jest to możliwe gdyż, jak już wspomniałem, metoda ta wywoływana jest w tym samym wątku co GUI. Warto zwrócić uwagę na przekazany argument dostępny pod e.UserState &#8211; znów konieczne jest rzutowanie. Po skończonej pracy odblokowywujemy przycisk start i to tyle.</p>
<p style="text-align: justify;"><strong><span style="font-size: medium;">Podsumowanie</span></strong></p>
<p style="text-align: justify;">Widzimy, że rozwiązanie problemu częściowego uaktualniania interfejsu za pomocą BackgroundWorkera jest bardzo łatwe. To jest niewątpliwy plus. Ten sposób ma też (jak chyba wszystko ;)) jednak swoje wady. Po pierwsze, widać w kodzie, że w wielu miejscach musimy stosować rzutowanie z typu object na inny typ. Nie jest to operacja bezpieczna i przy jakichkolwiek zmianach w kodzie należy pamiętać aby pozmieniać też rzutowania w innych miejscach. Innym minusem jest utrudnione oddzielnie widoku od logiki, gdyż klasa BackgroundWorker pozostaje mocno powiązana z GUI.</p>
<p style="text-align: justify;">Konicząc mój wywód &#8211; jeśli tworzysz małą aplikację lub pogodzenie się z minusami BackgroundWorkera nie jest szkodliwe dla Ciebie, ani dla tworzonego kodu &#8211; jak najbardziej polecam to rozwiązanie, bo po co pisać kod, który stworzył już ktoś wcześniej?</p>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2009/08/prosty-sposob-na-uaktualnienie-gui-za-pomoca-backgroundworkera/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Producent i konsument &#8211; przykład użycia słowa kluczowego lock</title>
		<link>http://lukaszsowa.pl/2009/07/producent-i-konsument-przyklad-uzycia-slowa-kluczowego-lock/</link>
		<comments>http://lukaszsowa.pl/2009/07/producent-i-konsument-przyklad-uzycia-slowa-kluczowego-lock/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 01:33:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[wielowątkowość]]></category>

		<guid isPermaLink="false">/post/2009/07/17/Producent-i-konsument-przyklad-uzycia-slowa-kluczowego-lock.aspx</guid>
		<description><![CDATA[Niejednokrotnie podczas pisania aplikacji napotyka się na sytuację gdy jedna metoda produkuje pewne dane, inna natomiast w pewien sposób je konsumuje. Czasem dobrym pomysłem jest, w przypadku gdy produkowane dane są w pewien sposób podzielne na części, wykonywać produkcję i konsumpcję w równoległych wątkach. Tutaj pojawia się istotny problem z zagadnienia wielowątkowości &#8211; synchronizacja. Oba [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Niejednokrotnie podczas pisania aplikacji napotyka się na sytuację gdy jedna metoda produkuje pewne dane, inna natomiast w pewien sposób je konsumuje. Czasem dobrym pomysłem jest, w przypadku gdy produkowane dane są w pewien sposób podzielne na części, wykonywać produkcję i konsumpcję w równoległych wątkach. Tutaj pojawia się istotny problem z zagadnienia wielowątkowości &#8211; synchronizacja. Oba (wszystkie) wątki współdzielące dany zasób muszą z niego korzystać w pewien ustalony sposób, tak aby w danej chwili korzystał z niego tylko jeden z wątków. W uproszczeniu, zapewnienie tego stanu nazywamy synchronizacją. Problem ten jest na tyle niebanalny i powszechny, że platforma .NET wspomaga synchronizację za pomocą wbudowanych mechanizmów. Jednym z nich jest słowo kluczowe <strong>lock</strong>. Użycie słowa kluczowego lock wygląda tak:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #0600FF; font-weight: bold;">lock</span><span style="color: #008000;">&#40;</span>somethingSharedToLock<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #008080; font-style: italic;">// operations on the locked object</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Jak widać składnia jest bardzo prosta, ale co tak właściwie daje nam lock? Użycie słowa kluczowego lock gwarantuje nam, iż żaden inny wątek nie będzie ingerował w zablokowany obiekt podczas wykonywania instrukcji z nawiasu klamrowego. Natomiast jeśli obiekt jest zablokowany przez inny wątek, to kolejny lock będzie cierpliwie czekał na zwolnienie obiektu i dopiero wtedy go zablokuje. Pięknie, prawda? :) Oczywiście lock, jak wszystko &#8211; ma swoje wady. Częste i nierozważne lockowanie może doprowadzić do tzw. <a href="http://pl.wikipedia.org/wiki/Zakleszczenie">zakleszczenia (ang. deadlock)</a>. Starczy tej teorii, przejdźmy do przykładu (przykład z całą pewnością nie pokazuje best practices tworzenia kodu, ale chodziło mi o maksymalne uproszczenie przykładu).</p>
<p style="text-align: justify;">Stwórzmy sobie prostą klasę producenta:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">class</span> Producer
<span style="color: #008000;">&#123;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> IsFinished
<span style="color: #008000;">&#123;</span>
    get<span style="color: #008000;">;</span>
    set<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> List
<span style="color: #008000;">&#123;</span>
    get<span style="color: #008000;">;</span>
    set<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> Producer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    List <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    IsFinished <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Produce<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Random random <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">20</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        List<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">20</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Producer[{0}]={1}&quot;</span>, i, List<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">500</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
    IsFinished <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Producer has finished his work&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Klasa ta, jak widać, w konstruktorze przyjmuję listę, a następnie po wywołaniu Produce() wpisuje do tej listy losowe liczby całkowite z przedziału &lt;0,20) wypisując je przy okazji. Klasa posiada pole które poinformuje nas, że praca została zakończona. Usypianie w metodzie produkującej umożliwi nam zaobserwowanie pewnej ciekawej rzeczy, ale o tym dalej.</p>
<p style="text-align: justify;">Klasa konsumenta:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">class</span> Consument
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> Producer producer<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Consument<span style="color: #008000;">&#40;</span>Producer producer<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">producer</span> <span style="color: #008000;">=</span> producer<span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Consume<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #6666cc; font-weight: bold;">int</span> currentElement <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
        <span style="color: #6666cc; font-weight: bold;">int</span> elementCount <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
              elementCount <span style="color: #008000;">=</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span>
&nbsp;
              <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> currentElement<span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
                   producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span> <span style="color: #008000;">+=</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
                   Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Consument[{0}]={1}&quot;</span>, currentElement, producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                   currentElement<span style="color: #008000;">++;</span>
              <span style="color: #008000;">&#125;</span>
              <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> currentElement <span style="color: #008000;">&amp;&amp;</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">IsFinished</span><span style="color: #008000;">&#41;</span>
                   <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
         <span style="color: #008000;">&#125;</span>
         Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Consument has finished his work&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p style="text-align: justify;">Konsument, w konstruktorze przyjmuje producenta, a po wywołaniu Consume(), o ile pojawiło się coś nowego zwiększa wartość każdego elementu o 2, a następnie go wypisuje. Metoda kończy swoje działanie w momencie, gdy Producent da o tym znać i wszystkie elementy zostaną zmienione.</p>
<p style="text-align: justify;">Pozostaje nam odpalić produkcje i konsumpcje w oddzielnych wątkach:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     Producer producer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Producer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     Consument consument <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Consument<span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     Thread producerThread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> ThreadStart<span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">Produce</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     Thread consumentThread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> ThreadStart<span style="color: #008000;">&#40;</span>consument<span style="color: #008000;">.</span><span style="color: #0000FF;">Consume</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
     producerThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     consumentThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     producerThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Join</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     consumentThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Join</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Wynik działania programu (przykładowy!!):</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">4</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">4</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">17</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">17</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">8</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">8</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">16</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">16</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">6</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">6</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">13</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">13</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">17</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">19</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">9</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">11</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">15</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">17</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">14</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">14</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">11</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">13</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">3</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">5</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">15</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">15</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">13</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">13</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">16</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">18</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">17</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">5</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">17</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">7</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">18</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">18</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">2</span>
Producer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">19</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">14</span>
Consument<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">19</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">16</span>
Producer has finished his work
Consument has finished his work</pre></div></div>

<p style="text-align: justify;">Ups! Widzimy, że w wielu przypadkach (1, 2, 3, 5, 6, 7, 11, 14, 15, 18 &#8211; czyli w połowie wszystkich) wartość producenta nie została zmieniona, tak jakbyśmy chcieli. Czemu się tak stało? Otóż produkcja kolejnych elementów trwa dłużej niż konsumpcja (poprzez wspomniane wcześniej Thread.Sleep(500)) co powoduje iż w pewnych momentach dana jest &#8222;jeszcze&#8221; tworzona, a próbuje już być skonsumowana, co powoduje iż proces konsumpcji (dodanie do wartości 2) zostaje pominięte. Uniknięcie tej katastrofy jest możliwe dzięki wspomnianemu lockowi. Wystarczy napisać:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">lock</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>ICollection<span style="color: #008000;">&#41;</span>List<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SyncRoot</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    List<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">20</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Producer[{0}]={1}&quot;</span>, i, List<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">500</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p style="text-align: justify;">oraz:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">lock</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>ICollection<span style="color: #008000;">&#41;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SyncRoot</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    elementCount <span style="color: #008000;">=</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> currentElement<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span> <span style="color: #008000;">+=</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
        Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Consument[{0}]={1}&quot;</span>, currentElement, producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        currentElement<span style="color: #008000;">++;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> currentElement <span style="color: #008000;">&amp;&amp;</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">IsFinished</span><span style="color: #008000;">&#41;</span>
        <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p style="text-align: justify;">To zapewni nam prawidłowe działanie kodu (jak nie wierzycie &#8211; sprawdźcie sami :)). A co tak właściwie się stało? Kolekcja w momencie produkowania jest na chwilę blokowana, a więc konsumpcja jest wtedy wstrzymana, gdy produkcja się skończy, konsumpcja zabiera kolekcję dla siebie. Dzięki temu działanie jest zgrabnie zsynchronizowane. Dla kolekcji, w celu synchronizacji należy używać właściwości <a href="http://msdn.microsoft.com/en-us/library/system.collections.icollection.syncroot.aspx">SyncRoot</a> która jest wymagana przez interfejs ICollection. Wszystkie inne obiekty możemy lockować w sposób bezpośredni (lock(someObject)) chyba, że coś (dokumentacja) podpowiada nam inaczej ;)</p>
<p style="text-align: justify;">To tyle w tej kwestii, dla zainteresowanych polecam poczytać <a href="http://msdn.microsoft.com/en-us/library/ms173179(VS.80).aspx">Thread Synchronization</a> oraz <a href="http://msdn.microsoft.com/en-us/library/yy12yx1f(VS.80).aspx">How to: Synchronize a Producer and a Consumer Thread</a>.</p>
<p>Pełny listing:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Threading</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> ProducentConsumerExample
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Example
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Producer producer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Producer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Consument consument <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Consument<span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread producerThread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> ThreadStart<span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">Produce</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Thread consumentThread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> ThreadStart<span style="color: #008000;">&#40;</span>consument<span style="color: #008000;">.</span><span style="color: #0000FF;">Consume</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            producerThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            consumentThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            producerThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Join</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            consumentThread<span style="color: #008000;">.</span><span style="color: #0000FF;">Join</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #6666cc; font-weight: bold;">class</span> Producer
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> IsFinished
        <span style="color: #008000;">&#123;</span>
            get<span style="color: #008000;">;</span>
            set<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span> List
        <span style="color: #008000;">&#123;</span>
            get<span style="color: #008000;">;</span>
            set<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> Producer<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            List <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            IsFinished <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Produce<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Random random <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">20</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">lock</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>ICollection<span style="color: #008000;">&#41;</span>List<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SyncRoot</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    List<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">20</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Producer[{0}]={1}&quot;</span>, i, List<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                    Thread<span style="color: #008000;">.</span><span style="color: #0000FF;">Sleep</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">500</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            IsFinished <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Producer has finished his work&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #6666cc; font-weight: bold;">class</span> Consument
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> Producer producer<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> Consument<span style="color: #008000;">&#40;</span>Producer producer<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">producer</span> <span style="color: #008000;">=</span> producer<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Consume<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> currentElement <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> elementCount <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">lock</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>ICollection<span style="color: #008000;">&#41;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SyncRoot</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    elementCount <span style="color: #008000;">=</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> currentElement<span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span> <span style="color: #008000;">+=</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">;</span>
                        Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Consument[{0}]={1}&quot;</span>, currentElement, producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">&#91;</span>currentElement<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                        currentElement<span style="color: #008000;">++;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>producer<span style="color: #008000;">.</span><span style="color: #0000FF;">List</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> currentElement <span style="color: #008000;">&amp;&amp;</span> producer<span style="color: #008000;">.</span><span style="color: #0000FF;">IsFinished</span><span style="color: #008000;">&#41;</span>
                        <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Consument has finished his work&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2009/07/producent-i-konsument-przyklad-uzycia-slowa-kluczowego-lock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 1.0 wydane!</title>
		<link>http://lukaszsowa.pl/2009/03/asp-net-mvc-1-0-wydane/</link>
		<comments>http://lukaszsowa.pl/2009/03/asp-net-mvc-1-0-wydane/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 23:49:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">/post/2009/03/18/ASPNET-MVC-10-wydane!.aspx</guid>
		<description><![CDATA[W końcu! Na stronach Microsoftu dostępne jest do ściągnięcia ASP.NET MVC 1.0. To doskonała wiadomość dla wszystkich developerów ASP.NET, sam nie mogę się doczekać, aż dobiorę się do świeżutkiego release&#8217;a. W związku z tym, z tego miejsca zapowiadam przepisanie mojego bloga (i udostępnienie źródeł) do ASP.NET MVC 1.0 :) Przy okazji polecam zapoznanie się z fragmentem książki, w którym [...]]]></description>
			<content:encoded><![CDATA[<div class="entry" style="text-align: justify;">
<p>W końcu! Na stronach Microsoftu dostępne jest do <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;displaylang=en">ściągnięcia</a> ASP.NET MVC 1.0. To doskonała wiadomość dla wszystkich developerów ASP.NET, sam nie mogę się doczekać, aż dobiorę się do świeżutkiego release&#8217;a.</p>
<p>W związku z tym, z tego miejsca zapowiadam przepisanie mojego bloga (i udostępnienie źródeł) do ASP.NET MVC 1.0 :) Przy okazji polecam zapoznanie się z <a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf">fragmentem książki</a>, w którym można znaleźć kompletną instrukcję na temat tego, jak zbudować kompletną aplikację w ASP.NET MVC.</p>
<p>PS. W następnej notce zamieszczę relację z C2C 2009.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2009/03/asp-net-mvc-1-0-wydane/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC &#8211; autoryzacja użytkowników dla leniwych</title>
		<link>http://lukaszsowa.pl/2008/09/asp-net-mvc-autoryzacja-uzytkownikow-dla-leniwych/</link>
		<comments>http://lukaszsowa.pl/2008/09/asp-net-mvc-autoryzacja-uzytkownikow-dla-leniwych/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 00:27:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[autoryzacja]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">/post/2008/09/23/ASPNET-MVC-autoryzacja-uzytkownikow-dla-leniwych.aspx</guid>
		<description><![CDATA[Jeśli chcemy ograniczyć użytkownikom dostęp do różnych funkcjonalności naszej strony napisanej w ASP.NET MVC możemy skorzystać z przydatnych Membership Providerów (tak jak w przykładowej aplikacji MVC), możemy też zainteresować się czymś takim. Również kuszącą opcją jest skorzystanie z (mniej lub bardziej rozbudowanej) Forms Authentication znanej dobrze z &#8222;czystego&#8221; ASP.NET. Ja skusiłem się na tę ostatnią opcję, gdyż chciałem [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Jeśli chcemy ograniczyć użytkownikom dostęp do różnych funkcjonalności naszej strony napisanej w ASP.NET MVC możemy skorzystać z przydatnych Membership Providerów (tak jak w przykładowej aplikacji MVC), możemy też zainteresować się <a href="http://www.codeplex.com/MvcMembership/">czymś takim</a>. Również kuszącą opcją jest skorzystanie z (mniej lub bardziej rozbudowanej) Forms Authentication znanej dobrze z &#8222;czystego&#8221; ASP.NET. Ja skusiłem się na tę ostatnią opcję, gdyż chciałem uzyskać efekt minimalnym nakładem pracy.</p>
<p style="text-align: justify;">Jeśli prowadzicie blog, jedyne czego Wam potrzeba, to ograniczyć &#8222;anonimowym&#8221; dostęp do pewnych stron i akcji (jak np. dodawanie nowych notek), a dla siebie zatrzymać pełne uprawnienia. W tej sytuacji moje minimalistyczne rozwiązanie wydaje się być rozsądne :) Do rzeczy!</p>
<p style="text-align: justify;">Na początek, w głównym pliku <strong>Web.config </strong>naszej aplikacji musimy dodać:</p>
<p style="text-align: justify;"><strong><span style="font-size: 10pt;">&lt;authentication mode=&#8221;Forms /&gt;&#8221;</span></strong></p>
<p style="text-align: justify;">Aby nasza aplikacja wiedziała, czego od niej chcemy ;) Teraz należałoby stworzyć zwykły widok-formularz, w którym umieścimy pola <strong>login</strong> i <strong>hasło</strong> oraz odwołanie do odpowiedniej akcji, na przykład:</p>
<p style="text-align: justify;"><strong><span style="font-size: 10pt;"> &lt;form action=&#8221;/Admin/Authenticate/&#8221; method=&#8221;post&#8221;&gt; </span></strong></p>
<p style="text-align: justify;">To znaczy, że po wciśnięciu przycisku submit uruchomiona zostanie akcja podłączona pod route (to wszystko można ustawić w <strong>Global.asax</strong>) &#8222;http://naszaplikacja.com/Admin/Authenticate/&#8221; przekazując przy tym wartości pól Login i Password. Proste, prawda? Teraz należałoby obsłużyć żądanie w kontrolerze. Przykładowa akcja poniżej:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008000;">&#91;</span>AcceptVerbs<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;POST&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> ActionResult Authenticate<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> Login, <span style="color: #6666cc; font-weight: bold;">string</span> Password<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>ZaawansowaMetodaAutoryzacji<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #0600FF; font-weight: bold;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">else</span>
<span style="color: #008000;">&#123;</span>
FormsAuthentication<span style="color: #008000;">.</span><span style="color: #0000FF;">SetAuthCookie</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Admin&quot;</span>, <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">return</span> Index<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Bardzo ważna jest tutaj linia:</p>
<p style="text-align: justify;"><strong><span style="font-size: 10pt;">FormsAuthentication.SetAuthCookie(&#8222;Admin&#8221;, false);</span></strong></p>
<p style="text-align: justify;">To ona spowoduje, że zostaniemy autoryzowani jako użytkownik &#8222;Admin&#8221;. Drugi parametr (&#8222;false&#8221;) działa jak znane pole &#8222;Remember me&#8221;, więcej do poczytania <a href="http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.setauthcookie.aspx">tutaj</a>. Fajnie, prawda?</p>
<p style="text-align: justify;">Teraz pozostaje nam już tylko oznaczyć odpowiednie akcje jako chronione. To ważne, <strong>chrońcie akcje a nie strony</strong>! Odpowiedź czemu zdaje się być oczywista. W dobrze napisanej aplikacji MVC każdy widok (każda strona) renderowana jest po przejściu przez kontroler, a więc przez odpowiednią akcję. Jeśli zabronimy &#8222;anonimowym&#8221; dostępu do odpowiednich akcji uzyskamy niemal 100% pewność, że nie obejrzą oni danej strony, ani nie wywołają nieprzeznaczonej dla nich metody (np. tworzącej nowy wpis na blogu) :) Jak zabronić dostępu użykownikowi do danej metody (akcji)? To bardzo proste. Wystarczy metodę oznaczyć atrybutem <strong>PrincipalPermission</strong>. Na przykład:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008000;">&#91;</span>PrincipalPermission<span style="color: #008000;">&#40;</span>SecurityAction<span style="color: #008000;">.</span><span style="color: #0000FF;">Demand</span>, Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Admin&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #008000;">&#91;</span>AcceptVerbs<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;POST&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> RedirectToRouteResult AddEntry<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> Title, <span style="color: #6666cc; font-weight: bold;">string</span> Text<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
dataContext<span style="color: #008000;">.</span><span style="color: #0000FF;">AddEntry</span><span style="color: #008000;">&#40;</span>Title, Text<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">return</span> RedirectToAction<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Recent&quot;</span>, <span style="color: #666666;">&quot;Blog&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Dzięki temu metoda &#8211; wpis może być dodany tylko przez użytkownika &#8222;Admin&#8221;. W taki sposób oznaczamy wszystkie metody, do których chcemy dodać restrykcje. To tyle! Tym sprytnym sposobem nasza aplikacja jest chroniona w bardzo prosty sposób :)</p>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2008/09/asp-net-mvc-autoryzacja-uzytkownikow-dla-leniwych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tworzymy własny kanał RSS 2.0, czyli kodujemy!</title>
		<link>http://lukaszsowa.pl/2008/09/tworzymy-wlasny-kanal-rss-2-0-czyli-kodujemy/</link>
		<comments>http://lukaszsowa.pl/2008/09/tworzymy-wlasny-kanal-rss-2-0-czyli-kodujemy/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 02:23:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">/post/2008/09/10/Tworzymy-wc582asny-kanac582-RSS-20-czyli-kodujemy!.aspx</guid>
		<description><![CDATA[Jeśli prowadzisz stronę z dynamiczną zawartością, to z całą stanowczością potrzebujesz udostępniać ją jako kanał informacyjny. Coraz więcej osób (w tym od niedawna ja ;)) przegląda niusy, wpisy na blogach tylko i wyłącznie używając syndykacji. Ba, myślę nawet, że wiele stron z powodzeniem istniałoby bez jakiegokolwiek layoutu, a jedynie jako feed :) Ale dosyć już [...]]]></description>
			<content:encoded><![CDATA[<div class="entry">
<p style="text-align: justify;">Jeśli prowadzisz stronę z dynamiczną zawartością, to z całą stanowczością potrzebujesz udostępniać ją jako kanał informacyjny. Coraz więcej osób (w tym od niedawna ja ;)) przegląda niusy, wpisy na blogach tylko i wyłącznie używając syndykacji. Ba, myślę nawet, że wiele stron z powodzeniem istniałoby bez jakiegokolwiek layoutu, a jedynie jako feed :) Ale dosyć już spekulacji, do dzieła! :)</p>
<p style="text-align: justify;">Istnieją dwa liczące się standardy kanałów są to <a href="http://pl.wikipedia.org/wiki/Atom_%28standard%29">Atom</a> i <a href="http://pl.wikipedia.org/wiki/RSS">RSS</a>. Polecam zapoznać się z linkami z jakże niezawodnej wikipedii :) W tym miejscu wypadałoby zdecydować się na któryś standard. Ja opiszę przygotowanie feeda w RSS 2.0, ale nic nie stoi na przeszkodzie, żeby zdecydować się na Atom. RSS wydaje mi się nadal być popularniejszym (osobiste odczucie), ale Atom depcze mu po piętach.<br />
Na początek wypadałoby utworzyć stronę o jakiejś wdzięcznej nazwie, np. Feed.aspx. To było proste, teraz jednak przechodzimy w końcu do kodu :) Nie będę się tutaj rozwodził nad specyfikacją gdyż można o niej przeczytać <a href="http://www.rssboard.org/rss-specification">tutaj</a>. Jeśli jesteś leniwy, to <a href="http://pl.wikipedia.org/wiki/Really_Simple_Syndication">wikipedia</a> przedstawia bardzo skrótowy opis i przykład, który jednak nam wystarcza. Oto fragmencik pliku generującego kanał z bloga, którego czytasz:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="asp" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #006600; font-weight: bold;">@</span> Page Language<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;C#&quot;</span> AutoEventWireup<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;true&quot;</span> CodeBehind<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;Feed.aspx.cs&quot;</span> Inherits<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;hLog.Views.Blog.Feed&quot;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span><span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">ContentType</span> <span style="color: #006600; font-weight: bold;">=</span> <span style="color: #cc0000;">&quot;application/xml&quot;</span><span style="color: #006600; font-weight: bold;">;</span><span style="color: #000000; font-weight: bold;">%&gt;</span><span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #006600; font-weight: bold;">@</span> Import Namespace<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;hLog.Models&quot;</span><span style="color: #000000; font-weight: bold;">%&gt;</span>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;rss version=&quot;2.0&quot;&gt;
&lt;channel&gt;
&lt;title&gt;Łukasz Sowa - blog programisty .NET&lt;/title&gt;
&lt;link&gt;http://lukaszsowa.pl&lt;/link&gt;
&lt;description&gt;Feed z najnowszymi notkami&lt;/description&gt;
<span style="color: #000000; font-weight: bold;">&lt;%</span> foreach<span style="color: #006600; font-weight:bold;">&#40;</span>Entry entry <span style="color: #990099; font-weight: bold;">in</span> ViewData.<span style="color: #9900cc;">Model</span><span style="color: #006600; font-weight:bold;">&#41;</span> <span style="color: #006600; font-weight:bold;">&#123;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>
&lt;item&gt;
&lt;title&gt;&lt;![CDATA[<span style="color: #000000; font-weight: bold;">&lt;%</span> <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span>entry.<span style="color: #9900cc;">Title</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>]]&gt;&lt;/title&gt;
&lt;pubDate&gt;&lt;![CDATA[<span style="color: #000000; font-weight: bold;">&lt;%</span> <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span>entry.<span style="color: #9900cc;">Date</span>.<span style="color: #9900cc;">ToString</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>]]&gt;&lt;/pubDate&gt;
&lt;link&gt;&lt;![CDATA[<span style="color: #000000; font-weight: bold;">&lt;%</span> <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;http://lukaszsowa.pl/Blog/View/&quot;</span> + entry.<span style="color: #9900cc;">ID</span> + <span style="color: #cc0000;">&quot;/&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>]]&gt;&lt;/link&gt;
&lt;description&gt;&lt;![CDATA[<span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span>entry.<span style="color: #9900cc;">Text</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>]]&gt;&lt;/description&gt;
&lt;/item&gt;
<span style="color: #000000; font-weight: bold;">&lt;%</span><span style="color: #006600; font-weight:bold;">&#125;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>
&lt;/channel&gt;
&lt;/rss&gt;</pre></td></tr></table></div>

<div class="entry">
<p style="text-align: justify;">Kod powinien mówić sam za siebie. Są wszystkie wymagane pola  , a dodatkowo również , które jest bardzo przydatnym polem. Zwróć uwagę na formatowanie (wymagane pola, kolejność, umiejscowienie), gdyż nawet drobne odstępstwa od reguł mogą powodować poważne błędy. Mój blog, czego tutaj niestety nie widać, pobiera 10 najnowszych postów, a następnie osadza je w znacznikach. Wyjaśnienia wymaga jeszcze tajemnicza CDATA. Otóż podczas parsowania pliku, w wygenerowanej zawartości mogą znaleźć się elementy, które zaburzą układ znaczników, a co za tym idzie – cały nasz Feed wygeneruje się z błędem. Tu właśnie przychodzi z pomocą CDATA. Wszystko co znajduje się pomiędzy znacznikami CDATA jest ignorowane podczas parsowania – czyli nasze dane nie zaburzą znaczników.</p>
<p style="text-align: justify;">No to pozostaje tylko odpalić stronkę i&#8230; ups! Kanał wyświetla się zapewne jako plaintext. Nie tego oczekujemy. Podgląd odebranego nagłówka wszystko wyjaśnia – przeglądarka traktuje dane, jako test. Musimy więc odpowiednio oprogramować zdarzenie Page_Load. Kod poniżej:</p>
</div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #6666cc; font-weight: bold;">void</span> Page_Load<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EvenrArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
Response<span style="color: #008000;">.</span><span style="color: #0000FF;">ContentType</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;application/xml&quot;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Teraz nasza przeglądarka będzie wiedziała (dzięki zmodyfikowanemu nagłówkowi), że odczytuje XML.</p>
<p style="text-align: justify;">Teraz już powinno wszystko działać. Voila! :) Ciesz się swoim własnym kanałem.</p>
<p style="text-align: justify;">PS. To mój pierwszy stricte techniczny tekst, więc liczę na feedback i wyrozumiałość :)</p>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2008/09/tworzymy-wlasny-kanal-rss-2-0-czyli-kodujemy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Starcie z ASP.NET MVC &#8211; akt I</title>
		<link>http://lukaszsowa.pl/2008/05/starcie-z-asp-net-mvc-akt-i/</link>
		<comments>http://lukaszsowa.pl/2008/05/starcie-z-asp-net-mvc-akt-i/#comments</comments>
		<pubDate>Sat, 31 May 2008 17:34:00 +0000</pubDate>
		<dc:creator>Łukasz</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">/post/2008/05/31/Starcie-z-ASPNET-MVC-akt-I.aspx</guid>
		<description><![CDATA[Skończyłem pisać obsługę kanału RSS dla bloga i postanowiłem skrobnąć nieco moich przemyśleń. System blogowy zacząłem pisać tydzień temu i mniej więcej gotowy był po 6 dniach (byłoby szybciej, gdyby nie moje problemy z ASP.NET :)). Wydaje mi się, że to całkiem niezła szybkość produkcji. Dodam, że proces tworzenia nie był zbyt intensywny, a moja [...]]]></description>
			<content:encoded><![CDATA[<div class="entry" style="text-align: justify;">
<p>Skończyłem pisać obsługę kanału RSS dla bloga i postanowiłem skrobnąć nieco moich przemyśleń. System blogowy zacząłem pisać tydzień temu i mniej więcej gotowy był po 6 dniach (byłoby szybciej, gdyby nie moje problemy z ASP.NET :)). Wydaje mi się, że to całkiem niezła szybkość produkcji. Dodam, że proces tworzenia nie był zbyt intensywny, a moja znajomość frameworku zbudowana była na lekturze 3 z 4 tutoriali <a href="http://weblogs.asp.net/scottgu">Scotta Guthrie</a>. Fakt, że może przez to cały system nie jest zbyt zaawansowany, ale jest i co najważniejsze – działa! ;)</p>
<p>Oprócz szybkości tworzenia, najważniejszą cechą powstającego dziecka MS jest to, że aplikacje webowy tworzy się dzięki niemu <strong>bardzo łatwo i przyjemnie</strong>. Naprawdę odczuwałem niesamowitą radość przy klepaniu. Wszystko przychodziło z łatwością, a jeśli nawet czegoś nie wiedziałem, to jedno, dwa spojrzenia w dokumentację (która co prawda jest na razie szczątkowa) i już wszystko było jasne. Kontrolery działają bardzo przewidywalnie (intuicyjnie konfigurowalny routing), a model (który wygenerowałem za pomocą LINQ to SQL – miodzio! korzystałem z tego pierwszy raz i jestem zachwycony!) świetnie z nimi współpracował. Do widoków dane przekazuje się bardzo łatwo – niejawnie, poprzez JEDEN słownik ViewData, bądź po prostu używając silnej typizacji (wymagana jest jedynie zmiana w klasy, z której dziedziczy dany widok. Wszystko to opisane jest <a href="http://weblogs.asp.net/scottgu/archive/2008/02/12/asp-net-mvc-framework-road-map-update.aspx"> tu</a>. Kolejną rzeczą, która zwróciła moją uwagę, to fakt, że w frameworku tym, przynajmniej na pierwszy rzut oka, nie widać „magii”, czyli tego co najbardziej raziło mnie w Ruby on Rails. Nie mam wielkiego doświadczenia z RoR, ale wydaje mi się, że produkt MS niczym nie ustępuje tworowi Davida Heinemeiera Hanssona. Większe doświadczenie mam z Django i stwierdzam, że póki co, ASP.NET MVC brakuje tej „lekkości”, którą ma pythonowy framework. Mam szczerą nadzieję, że to jednak się jeszcze zmieni, przecież dopiero mamy wersję Preview 3, a Django już zdążyło zdobyć doświadczenie na polu frameworków webowych. Kolejną rzeczą, którą można uważać za pewnego rodzaju minus jest <strong>brak jakichkolwiek skryptów wspomagających</strong> takich jak scaffold w Ruby, czy admin page w Django. Z drugiej strony skrypty te trochę „zaciemniają” oczywistość frameworka, a wszystkie strony tworzone przy ich pomocy są do siebie bardzo podobne, więc przy profesjonalnych cyklach produkcyjnych raczej nie mają zastosowania na większą skalę. Ostatnim minusem jest kiepska integracja z VS. IDE często udziela ostrzeżeń, bądź nawet uważa coś za ewidentny błąd mimo, że kompilator to kompiluje i wszystko działa. Choć może to bardziej wina VS..?</p>
<p>To tyle na pierwszy akt :) Dodam jeszcze, że moje wrażenia opieram na wersji Preview 2, gdyż nie miałem jeszcze okazji zlustrować „trójki”.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lukaszsowa.pl/2008/05/starcie-z-asp-net-mvc-akt-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

