<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>dotnetphen</title>
  <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/" />
  <link rel="self" href="http://www.dotnetphen.com/blog/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2008-08-29T21:23:36.8188713+02:00</updated>
  <author>
    <name>Peter Vitt</name>
  </author>
  <subtitle>or was it .NET fan?</subtitle>
  <id>http://www.dotnetphen.com/blog/</id>
  <generator uri="http://dasblog.info/" version="2.1.8139.823">DasBlog</generator>
  <entry>
    <title>Nachtrag zur Zwangsheirat: §91 AO</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/08/26/NachtragZurZwangsheirat91AO.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,e391a64b-dcd9-481e-92b7-a499d243558d.aspx</id>
    <published>2008-08-26T22:47:36.7984114+02:00</published>
    <updated>2008-08-26T22:51:59.5796614+02:00</updated>
    <category term="Offtopic" label="Offtopic" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Offtopic.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Mit AO ist die <a href="http://bundesrecht.juris.de/bundesrecht/ao_1977/gesamt.pdf">Abgabenordnung</a> gemeint,
in der die grundlegenden Regelungen für Besteuerungsverfahren verzeichnet sind. In
meinem <a href="http://www.dotnetphen.com/blog/2008/08/24/Zwangsheirat.aspx">Widerspruch
gegen die Zwangsheirat</a> wurde § 91 AO erwähnt. Diesen möchte ich hier kurz nachreichen
;)<br /><br /><font face="Times New Roman">§ 91 Anhörung Beteiligter<br />
(1) Bevor ein Verwaltungsakt erlassen wird, der in Rechte eines Beteiligten eingreift,
soll diesem Gelegenheit gegeben werden, sich zu den für die Entscheidung erheblichen
Tatsachen zu äußern. Dies gilt insbesondere, wenn von dem in der Steuererklärung erklärten
Sachverhalt zuungunsten des Steuerpflichtigen wesentlich abgewichen werden soll.<br />
(2) Von der Anhörung kann abgesehen werden, wenn sie nach den Umständen des Einzelfalls
nicht geboten ist, insbesondere wenn 
<br /></font><blockquote><font face="Times New Roman">1. eine sofortige Entscheidung wegen
Gefahr im Verzug oder im öffentlichen Interesse notwendig erscheint,</font><br /><font face="Times New Roman">2. durch die Anhörung die Einhaltung einer für die Entscheidung
maßgeblichen Frist in Frage gestellt würde,</font><br /><font face="Times New Roman">3. von den tatsächlichen Angaben eines Beteiligten, die
dieser in einem Antrag oder einer Erklärung gemacht hat, nicht zu seinen Ungunsten
abgewichen werden soll, </font><br /><font face="Times New Roman">4. die Finanzbehörde eine Allgemeinverfügung oder gleichartige
Verwaltungsakte in größerer Zahl oder Verwaltungsakte mit Hilfe automatischer Einrichtungen
erlassen will,</font><br /><font face="Times New Roman">5. Maßnahmen in der Vollstreckung getroffen werden sollen.</font><br /></blockquote><font face="Times New Roman">(3) Eine Anhörung unterbleibt, wenn ihr
ein zwingendes öffentliches Interesse<br />
entgegensteht.</font><br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=e391a64b-dcd9-481e-92b7-a499d243558d" /></div>
    </content>
  </entry>
  <entry>
    <title>?? Operator in C#</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/08/26/OperatorInC.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,ed757fba-ba8c-4899-978f-bf182b9d3855.aspx</id>
    <published>2008-08-26T22:09:39.048+02:00</published>
    <updated>2008-08-29T21:23:36.8188713+02:00</updated>
    <category term="C#" label="C#" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="Snippet" label="Snippet" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Snippet.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Wer hätte das gedacht; In der C#-Spezifikation
habe ich bereits das ein oder andere Mal herumgestöbert. Dabei ist mir aber glatt
der <a href="http://msdn.microsoft.com/en-us/library/ms173224.aspx">Null-Koaleszenz-Operator
??</a> durch die Lappen gegangen. Wer ihn noch nicht kennt, sollte ihn sich einmal
anschauen. Es lohnt sich auf jeden Fall.<br /><br />
Wo ich es her habe: <a href="http://blog.veloursnebel.de/PermaLink,guid,d2b14e56-6970-43aa-916c-4469de27fa57.aspx">BlaBlubBlog</a><br />
Wo es sonst nach was dazu zu lesen gibt: <a href="http://blog.norberteder.com/index.php?entry=entry061113-082129">Norbert
Eder</a><br />
Wo man es brauchen kann:<br />
In der nachfolgenden Funktion wird durch den Null-Koaleszenz-Operator sichergestellt,
dass die Klasse test in der Methode Main auf jeden Fall ungleich null ist (auf Stil
und Schönheit wurde übrigens in diesem Beispiel kein Wert gelegt).<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">namespace</span> ConsoleApplication1
{     <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System;
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program
    {         <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Main( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span>[]
args )         {             TestClass
test <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> TestClass.CreateClass(
) ?? <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> TestClass(
);         }         <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> TestClass
        {             <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">bool</span> IsValid
{ get; <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span> set;
}             <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span> TestClass(
)             {            
}             <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span> TestClass
CreateClass( )             {
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> ( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Random(
).Next( 1 ) == 0 )                 {
                    TestClass
result <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> TestClass(
);                     result.IsValid <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">true</span>;
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span> result;
                }
                <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">null</span>;
            }         }
    } } </span></pre><br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=ed757fba-ba8c-4899-978f-bf182b9d3855" /></div>
    </content>
  </entry>
  <entry>
    <title>Zwangsheirat</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/08/24/Zwangsheirat.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,24ffa2e2-c4cf-4f6a-b848-f994fa80f9f7.aspx</id>
    <published>2008-08-24T17:02:09.2318484+02:00</published>
    <updated>2008-08-24T17:35:41.947471+02:00</updated>
    <category term="Offtopic" label="Offtopic" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Offtopic.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So, der gröbste Umzugsstress ist vorbei
und meine Rechner sind auch wieder im Netz. Ich möchte daher den freien Nachmittag
nutzen, um eine kleine Geschichte zu erzählen, die mir während der Umzugsvorbereitungen
passiert ist. Sie gehört ganz klar in die Kategorie: Was man während der Umzugsvorbereitungen
überhaupt nicht gebrauchen kann.<br /><h3>Der erste Brief
</h3>
Am 09.07.2008 erreichte mich folgender Brief:<br /><br /><b>Von: </b><br />
Finanzamt XXX<br /><br /><b>An:</b><br />
Herrn Peter Vitt 
<br />
Frau A B (Name geändert)<br />
Meine Privatadresse<br /><br /><b>Text:</b><br />
Sehr geehrter Herr Vitt, sehr geehrte Frau B,<br />
Sie werden künftig bei dem Finanzamt XXX für die Einkommensteuer unter der Steuernummer
123/4567/8910 (bisher 109/8765/4321) geführt.<br />
{Allgemeine Hinweise}<br /><br />
Leider verhält es sich so, dass ich Frau A B überhaupt nicht kenne, geschweige denn,
mit ihr verheiratet oder anderweitig liiert bin. Wie kommt das Finanzamt wohl zu der
Annahme, uns nun gemeinsam veranlagen zu müssen. Einige Tage später rief ich darauf
hin beim Finanzamt an. Der Sachbearbeiter, der sich meldete (seine Nummer stand auf
dem Brief) konnte mit der Sache jedoch nichts anfangen und wusste auch nicht, wie
seine Nummer wohl auf den Brief gekommen ist.. Er versprach, sich um die Sache zu
kümmern. 
<br /><h3>Der zweite Brief
</h3>
Als ich zwei Wochen später noch immer nichts vom Finanzamt gehört hatte, verfasste
ich einen Brief. Am 21.07.2008 schrieb ich:<br /><br /><b>Von: </b><br />
Peter Vitt<br /><br /><b>An:</b><br />
Finanzamt XXX<br /><br /><b>Subject:</b><br />
Einspruch gegen Zwangsheirat<br /><br /><b>Text:</b><br />
Sehr geehrte Damen und Herren,<br />
Hiermit erhebe ich Einspruch gegen die von Ihnen vorgenommene Zwangsheirat von mir,
Herrn Peter Vitt, {Geburtsdatum und -ort}, mit Frau A B, weitere Daten unbekannt,
welche mir in Ihrem Schreiben vom 09.07.2008 mitgeteilt wurde.<br /><br /><i><b>Hinweis:</b> Seit dem 19. Februar 2005 ist Zwangsheirat als "Nötigung zur Eingehung
der Ehe" ausdrücklich aks Regelbeispiel für einen besonders schweren Fall der Nötigung
gemäß § 240 Abs. 4 Nr 1, 2. Alternative des Strafgesetzbuchs (StGB) strafbar. Die
Tat wird mit Freiheitsstrafe von sechs Monaten bis zu fünf Jahren bestraft. Der Tatbestand
der 240 StGB lautet auszugsweise:<br /></i><blockquote><font face="Times New Roman">"(1) Wer einen Menschen rechtswidrig,
mit Gewalt oder durch Drohung mit einem empfindlichen Übel zu einer Handlung, Duldung
oder Unterlassung nötigt, wird mit Freiheitsstafe bis zu drei Jahren oder mit Geldstrafe
bestraft.<br />
...<br />
(4) In besonders schweren Fällen ist die Strafe Freiheitsstrafe von 6 Monaten bis
zu fünf Jahren. Ein besonders schwerer Fall liegt in der Regel vor, wenn der Täter<br /></font><font face="Tahoma"><i>1.eine andere Person zu einer sexuellen Handlung oder
zur Eingehung der Ehe nötigt. ..."</i></font><br /></blockquote>Hätten Sie mir Frau B wenigstens vorgestellt; Die Katze im Sack kaufe
ich nicht einmal dem Finanzamt ab. Außerdem ist meinen Recherchen nach Frau B Jahrgang
1954. Das entspricht nicht ganz meiner Altersklasse. Sollten Sie also noch einmal
auf die Idee einer Zwangsheirat kommen, bitte ich Sie, die Auswahl zielgruppengerecht
durchzuführen und den beteiligten Parteien ein Mitspracherecht einzuräumen. Und Singles
eignen sich im Übrigen besser für solche Vorhaben. Sie können sich nicht vorstellen,
wie meine wirkliche Partnerin auf diese Nachricht reagiert hat.<br /><br />
Zurück zur Sache: Ich möchte darum bitten, dass die Zusammenveranlagung unter der
Steuernummer 123/4567/8910 rückgängig gemacht wird und ich wieder <b>allein</b> unter
meiner bisherigen Steuernummer 109/8765/4321 geführt werden. Des Weiteren möchte ich
darum bitten, meine Lohnsteuererklärung, die Anfang Juni 2008 unter meinem Namen und
der Steuernummer 109/8765/4321 bei Ihnen eingegangen ist, schnellstmöglich zu bearbeiten.<br /><br />
Mit freundlichen Grüßen<br /><h3>Der dritte Brief
</h3>
Am 24.07.2008 erreichte mich folgende Mitteilung:<br /><br /><b>Von: </b><br />
Finanzamt XXX<br /><br /><b>An:</b><br />
Herrn Peter Vitt 
<br />
Meine Privatadresse<br /><br /><b>Text:</b><br />
Sehr geehrter Herr Vitt, sehr geehrte Frau B,<br />
Sie werden künftig bei dem Finanzamt XXX für die Einkommensteuer unter der Steuernummer
123/4567/1098 (bisher 123/4567/8910) geführt.<br />
{Allgemeine Hinweise}<br /><br />
Sollte das Finanzamt wirklich so dröge sein?<br /><h3>Der vierte Brief
</h3>
Am 25.04.2008 erreichte mich dann noch ein Schreiben:<br /><br /><b>Von: </b><br />
Finanzamt XXX<br /><br /><b>An:</b><br />
Peter Vitt<br /><br /><b>Subject:</b><br />
Einspruch gegen Zwangsheirat, Ihr Schreiben v. 21.07.08<br /><br /><b>Text:</b><br />
Sehr geehrter Herr Vitt,<br />
Ich möchte mich für Ihren Hinweis bezüglich der von uns durchgeführten Zwangsheirat
und die rechtlichen Ausführungen zu dieser Problematik bedanken.<br />
Es tut mir leid, dass wir Sie mit der von uns ausgewählten Partnerin nicht zufriedenstellen
konnten. Ich verspreche, dass wir uns zukünftig mit der Auswahl mehr Mühe geben und
auch die Betreffenden vorher anhören werden, § 91 AO.<br /><br />
Aufgrund eines Eingabefehlers wurde Ihnen Frau A B als Ehefrau zugeordnet. Ich bitte
dieses Versehen zu entschuldigen und hoffe, dass Ihnen hierdurch keine großen Unannehmlichkeiten
entstanden sind.<br /><br />
Ihre "Zwangsehe" wurde bereits wieder aufgehoben.<br /><br />
{...alte Steuernummer...neue Steuernummer...Einkommensteuererklärung...veranlagt...}<br /><br />
Mit freundlichen Grüßen<br /><br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=24ffa2e2-c4cf-4f6a-b848-f994fa80f9f7" /></div>
    </content>
  </entry>
  <entry>
    <title>Winsock connect immer erfolgreich</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/07/28/WinsockConnectImmerErfolgreich.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,5e87ff6b-4597-43f0-a554-09564cb547a0.aspx</id>
    <published>2008-07-28T20:20:13.201+02:00</published>
    <updated>2008-07-31T12:22:50.4521625+02:00</updated>
    <category term="C" label="C" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="Hardware" label="Hardware" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Hardware.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Nun, ein seltsames Problem ist mir da über
den Weg gelaufen. Letzte Woche ist mein neues Werkzeug angekommen; Ein Laptop soll
meine Shuttle-PC ersetzen. Heute habe ich zum ersten Mal die Windows-Version unseres
aktuellen Projekts gestartet und dabei ein Verhalten beobachtet, dass mir bereits
einige Entwickler aus dem Team berichtet hatten, ich jedoch nicht reproduzieren konnte. 
<br /><br />
Der Laptop ist mit einem Kabel am Netzwerk angeschlossen. Das Kabel  war vorher
an einem <a href="http://www.echelon.com/products/cis/">i.LON 100 internet server</a> angeschlossen,
für den ich ein Netzwerk-Interface programmiert habe. Da dies nun abgeschlossen ist,
habe ich dem Server einfach mal das Kabel geklaut und meinen Laptop damit verbunden.
Als ich nun die Software angeworfen habe, hat diese auch schön brav die Konfigurationsdatei
für das Interface gefunden, die EInstellungen ausgelesen und wollte diese mit dem
Server angleichen. Also, Socket aufmachen und Packete tauschen. Was ja nicht funktioniert,
da der Server nicht am Netzwerk hängt. Allerdings schlug beim connect() nicht der
Timeout zu, sondern es wurde eine korrekte Verbindung gemeldet. 
<br /><br />
Auf die Schnelle konnte ich im Netz nichts finden, auch eine andere Entwickler hatten
dies noch nicht beobachtet. Ich dachte daher, dass es an der geänderten Netzwerkhardware
oder dem Treiber liegen müssen. Also habe ich den aktuellsten Treiber installiert;
jedoch ohne Erfolg.<br /><br />
Gerade bin ich jedoch auf eine interessante Seite gestoßen: <a href="http://tangentsoft.net/wskfaq/intermediate.html#inetconn">Die
winsock Implementierung meldet immer einen erfolgreichen connect, wenn eine Modemverbindung
verfügbar ist</a>. Wobei verfügbar nicht mit geöffnet zu verwechseln ist, sondern
wenn ein Modem vorhanden ist. 
<br /><br />
Ich werde also morgen mal im BIOS das Modem des Laptops deaktivieren und dann mal
schauen, ob ich noch immer einen erfolgreichen Verbindungsversuch gemeldet bekomme.
Für mich als Winsock-Neuling auf jeden Fall ein lehrhafter Tag. Morgen mehr...<br /><br /><b>Nachtrag 31.07.08:</b><br />
Es ist nicht ganz beim 29.07. geblieben. Allerdings habe ich mittlerweile einige Test
durchgeführt. Weder das Ausschalten des Modems in Gerätemanager noch das Ausschalten
des Modems im BIOS hat das Ergebnis de Connect-Methode beeinflusst. Ich werde das
ganze noch einige Male beobachten. Vlt. hat ja noch jemand eine Idee? Sollte sich
was ergeben, werde ich es natürlich hier bekannt geben.<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=5e87ff6b-4597-43f0-a554-09564cb547a0" /></div>
    </content>
  </entry>
  <entry>
    <title>Spartanisch Programmieren - von Stefan Lieser</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/07/22/SpartanischProgrammierenVonStefanLieser.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,09422068-42b3-4182-966d-20301e4917ea.aspx</id>
    <published>2008-07-22T19:01:54.2760462+02:00</published>
    <updated>2008-07-22T19:15:57.086164+02:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NET.aspx" />
    <category term="C" label="C" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="C#" label="C#" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="Common" label="Common" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Common.aspx" />
    <category term="Snippet" label="Snippet" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Snippet.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://www.lieser-online.de/blog/?p=94">Stefan
Lieser schreibt in seinem Blog, er wäre ein Freund des spartanischen Programmierens</a>.
Ich kann mich ihm dort nicht anschließen, da ich lieber Code schreibe, der sich lesen
lässt; Variablen bekommen Namen, die auch ein Außenstehender versteht, Code wird kommentiert,
es wird mit Freizeilen zur Strukturierung gearbeitet etc. Aber das ist, wie Stefan
bereits schrieb, eine persönliche Einstellung. Wenn sie nicht durch Implementierungskonventionen
erzwungen oder verboten wird.<br /><br />
Weshalb ich mich jedoch aufgefordert fühle, auf seinen Blogpost zu antworten, ist
sein Fast-Exit-Beispiel. Um eine große Verschachtelungstiefe zu vermeiden, schreibt
Stefan lieber viele Exits in einer Funktion, statt seinen Code ordentlich zu strukturieren.
Zuerst ein schlechtes Beispiel (von Stefan ebenfalls als schlecht angesehen):<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> DoSomething()
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (a)
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (b)
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (c)
{ DoItRealy(); } } } } </span></pre>Nun seine Verbesserung (Stichwort Fast-Exit),
mit der ich noch immer nicht einverstanden bin:<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> DoSomething()
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!a)
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span>;
} <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!b)
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span>;
} <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!c)
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">return</span>;
} DoItRealy(); }</span></pre><br />
Und nun zwei Arten, die ich persönlich den beiden Vorangegangenen (nicht uneingeschränkt,
aber meistens) vorziehen würde:<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> DoSomething()
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
( a ) &amp;&amp; ( b ) &amp;&amp; ( c ) ) { DoItRealy(); } } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> DoSomething()
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!a)
{ Log(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Not
a"</span>); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!b)
{ Log(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Not
b"</span>); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (!c)
{ Log(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Not
c"</span>); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {
Log(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"All
requirements complied."</span>); DoItRealy(); } }</span></pre><br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=09422068-42b3-4182-966d-20301e4917ea" /></div>
    </content>
  </entry>
  <entry>
    <title>creative commons-Party in Siegen</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/07/17/creativeCommonsPartyInSiegen.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,4a02aad5-b19b-4ceb-b80b-cba51b739be7.aspx</id>
    <published>2008-07-17T12:33:58.4258547+02:00</published>
    <updated>2008-07-17T12:50:34.073533+02:00</updated>
    <category term="Common" label="Common" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Common.aspx" />
    <category term="Offtopic" label="Offtopic" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Offtopic.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So, nach langer Zeit nochmal ein Post. Diesmal
auch nur, da der Lokalpatriotismus mich dazu treibt ;) Technische Einträge werden
auch wieder hier erscheinen, allerdings ist momentan die Zeit einfach etwas zu knapp.<br /><br />
Nun zum eigentlichen Thema: In Siegen findet am 05.09.2008 die erste (Siegens erste)
"creative commons"-Party statt. Das 7inch geht auch diesmal wieder in die Vorreiterrolle;
dort geht es um 19:00 Uhr los, der Eintritt ist frei (was auch sonst). Wer möchte,
kann sich die dort gespielte Musik auf einen mitgebrachten USB-Stick kopieren lassen.
Und wer nicht kommen kann, findet neben einigen Informationen auch zwei Live-Streams
auf der <a href="http://www.prodigynet.de/">Seite der Veranstalter</a>.<br /><br />
Falls sich jemand fragt, was eine "creative commons"-Party ist: <a href="http://de.creativecommons.org/index.php">Creative
Commons ist eine Lizenzform</a>, so wie die GPL. Nun gibt es Musiker, die ihre Musik
unter einer CC-Lizenz veröffentlichen. Je nach Ausprägung kann diese Musik unterschiedlich
verwendet werden (herunterladen und weiterverbreiten, weiterverbreiten nur mit Nennung
des Künstlers etc.). Die Beiträge in diesem Blog werden zum Beispiel unter der <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/de/">"CC
by-nc-sa"-Lizenz</a> veröffentlicht: Man darf vervielfältigen, veröffentlichen, verbreiten
und weiterverarbeiten. Bedingungen: Namensnennung, keine kommerzielle Nutzung, Weitergabe
unter gleichen Bedingungen.<br /><br />
Eine "creative commons"-Party nun ist eine Party, bei der nur Musik gespielt wird,
die frei erhältlich ist, sozusagen Open-Source-Musik. Daher ist auch die Mitnahme
auf USB-Stick möglich.<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=4a02aad5-b19b-4ceb-b80b-cba51b739be7" /></div>
    </content>
  </entry>
  <entry>
    <title>InternalsVisibleToAttribute</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/06/24/InternalsVisibleToAttribute.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,af918a8b-a9b5-4fbe-900a-74cafc09ee1a.aspx</id>
    <published>2008-06-24T23:35:27.1250187+02:00</published>
    <updated>2008-06-24T23:41:09.3281437+02:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NET.aspx" />
    <category term="dasBlog" label="dasBlog" scheme="http://www.dotnetphen.com/blog/CategoryView,category,dasBlog.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Ein nettes Fundstück: Ich habe gerade ein
wenig mit der Testfunktionalität von VS2008 herumgespielt, um ein paar Änderungen
an der Blog-Engine zu testen, da bin ich auf das nette Attribut <a href="http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx">InternalsVisibleToAttribute </a>gestoßen.
Mit diesem Attribut kann man einer Assembly Zugriff auf internal deklarierte Methoden
einer anderen Assembly gewähren. Sehr nettes <a href="http://weblogs.asp.net/nunitaddin/archive/2004/08/13/214130.aspx">Feature
für Unit Tests</a>.<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=af918a8b-a9b5-4fbe-900a-74cafc09ee1a" /></div>
    </content>
  </entry>
  <entry>
    <title>Hotlines sind was feines - Die Computer dahinter erst recht</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/06/24/HotlinesSindWasFeinesDieComputerDahinterErstRecht.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,5d7d3ea0-3c3b-48dd-a3d4-31aa10f9e2b6.aspx</id>
    <published>2008-06-24T21:44:18.1093937+02:00</published>
    <updated>2008-06-24T22:08:36.0937687+02:00</updated>
    <category term="Offtopic" label="Offtopic" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Offtopic.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Hotlines sind ein Quell steter Freude. Gestern
habe ich versucht, eine DSL-Verfügbarkeitsprüfung durchführen zu lassen, jedoch lieferte
die Abfrage im Internet keine Ergebnisse:<br /><hr size="2" width="100%" />
Wir können leider nicht überprüfen, ob DSL an Ihrem Anschluss verfügbar ist.<div class="group"><p>
Leider können wir für Ihren Anschluss keine verfügbare DSL-Bandbreite ermitteln. Dies
kann mehrere Gründe haben:
</p><ul class="info unk"><li>
Sie haben keinen Telekom-Telefonanschluss<br /></li><li>
Ihr Anschluss ist noch nicht in unserer Datenbank erfasst</li><li>
Die DSL-Bandbreite muss manuell gemessen werden</li></ul>
Wir empfehlen Ihnen dennoch das für Sie optimale Komplettpaket. Vor der Freischaltung
muss die verfügbare Bandbreite eventuell manuell ermittelt werden. 
</div><hr size="2" width="100%" />
Neben dieser Anzeige steht die Nummer der Hotline 0800-3355222. Da war es für mich
naheliegend, dort anzurufen. Gesagt, getan. Die nette Dame teilte mir aber mit, dass
ich die falsche Hotline angerufen habe, ich müsse mich an die Telekom-Standard-Hotline
0800-3301000 wenden. Diese sei aber nicht mehr besetzt. Also habe ich dort vor dreißig
Minuten angerufen und gehofft, dass ich noch jemanden erreiche. Sie schien sogar besetzt
zu sein, denn nach einem netten Gespräch mit dem Computer war ich auch schon in der
Warteschlange. Und wie das so üblich ist in einer Warteschlange, habe ich gewartet.
17 Minuten. Um dann mit dem Kommentar "Alle Plätze sind belegt, versuchen Sie es später
noch einmal" aus der Warteschlange gekickt zu werden. Danke, Telekom. Hat euer Computer
17 Minuten gebraucht, um festzustellen, dass ihr viel zu tun habt? Besonders kundenfreundlich
ist so etwas ja nicht gerade. Ich denke, ich werde morgen dem T-Punkt einen Besuch
abstatten. Dort soll es noch Menschen geben.<br /><br />
Allerdings; Allemal besser als bei GMX. Dort werden Anrufe von unliebsamen Kunden
nämlich gar nicht mehr angenommen. Rabiat, aber hilfreich. Kurzfristig jedenfalls.
Sollte das gängige Praxis bleiben, wird GMX wahrscheinlich von den Kunden nicht mehr
angenommen. 
<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=5d7d3ea0-3c3b-48dd-a3d4-31aa10f9e2b6" /></div>
    </content>
  </entry>
  <entry>
    <title>Multithreading - Teil 2 - System.Threading.Monitor</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/06/23/MultithreadingTeil2SystemThreadingMonitor.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,9af582e4-a737-4699-aee5-5d356b791896.aspx</id>
    <published>2008-06-23T21:36:36.7996442+02:00</published>
    <updated>2008-06-23T22:06:00.7058942+02:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NET.aspx" />
    <category term="C#" label="C#" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Im zweiten Teil der unbestimmt langen Reihe
Multithreading in .NET befasse ich mich mit der <a href="http://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx">Klasse
System.Threading.Monitor</a>.<br /><h2>System.Threading.Monitor
</h2>
Der Monitor ist das Objekt, was sich bei genauerer Betrachtung hinter einem lock-Statement
verbirgt. Die Details dazu können <a href="http://www.dotnetphen.com/blog/2008/06/08/MultithreadingTeil1DasLockStatement.aspx">im
ersten Teil nachgelesen werden</a>. Die Verwendung ist der eines lock-Statements sehr
ähnlich. Man verwendet den Monitor stets in Verbindung mit einem Objekt, welches verriegelt
werden soll. Der daraus resultierende IL-Code unterscheidet sich ebenfalls nicht von
dem eines lock-Statements.<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> monitorNotationExample( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">object</span> lockObject
) { Monitor.Enter( lockObject ); <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//Critical
Section: Do something</span> Monitor.Exit( lockObject ); }</span></pre>Nach der Critical
Section muss allerdings im Gegensatz zum lock-Statement die Verriegelung explizit
wieder freigegeben werden. Dies macht den Monitor etwas fehleranfälliger als das lock-Statement.
Er hat allerdings auch einige ganz entscheidende Vorteile.<br /><h1>Vorteile der Klasse Monitor gegenüber lock
</h1>
Die Klasse Monitor stellt neben der Funktion Enter noch die Funktion TryEnter bereit,
um eine exklusive Sperre für eine Critical Section zu bekommen. Die Funktion TryEnter
ist doppelt überladen und liefert jeweils einen Booleschen Wert zurück.<br /><h2><a href="http://msdn.microsoft.com/en-us/library/4tssbxcw.aspx">Monitor.TryEnter</a></h2>
Der Aufruf der Funktion Monitor.TryEnter(Object) versucht, eine exklusive Sperre auf
das übergebene Objekt zu erlangen. Schlägt dies fehl, weil bereits ein anderer Thread
eine Sperre auf dieses Objekt hält, liefert die Funktion ein false zurück. Konnte
die Sperre erlangt werden, wird true zurückgegeben. 
<br /><h2><a href="http://msdn.microsoft.com/en-us/library/42h9d380.aspx">Monitor.TryEnter
(Object, Int32)</a></h2>
Die erste Überladung der Funktion mit dem zusätzlichen Parameter vom Typ Int32 dient
dazu, einen Timeout anzugeben. Dieser Timeout wird Anzahl der Millisekunden übergeben,
die maximal versucht werden soll, eine exklusive Sperre für das Objekt zu erlangen.
Wird zu einem beliebigen Zeitpunkt innerhalb der Zeitspanne die Sperre erlangt, gibt
der Aufruf true zurück. Wird der Timeout erreicht, kehrt der Aufruf mit false zurück.
Dieser Aufruf ermöglicht es also, eine bestimmte Zeit auf eine Sperre zu warten. Der
Rückgabewert muss also in jedem Fall ausgewertet werden. Außerdem muss man bei der
Verwendung der Funktion Monitor.TryEnter (Object, Int32) darauf achten, dass eine
geeignete Strategie vorhanden ist für den Fall, dass keine Sperre registriert werden
konnte.<br /><h2><a href="http://msdn.microsoft.com/en-us/library/zxbdx9xx.aspx">Monitor.TryEnter
(Object, TimeSpan)</a></h2>
Die zweite Überladung verlangt als zweiten Parameter keinen Int32, der die Anzahl
der Millisekunden für den Timeout angibt, sondern eine Zeitspanne vom Typ <a href="http://msdn.microsoft.com/en-us/library/system.timespan.aspx">System.TimeSpan</a>.
Mit dieser zweiten Überladung ist es also möglich, die ersten beiden Funktionsaufrufe
nachzubilden. Entweder wird als Zeitspanne wirklich eine Zeitspanne übergeben, was
der ersten Überladung entspräche, oder es wird <a href="http://msdn.microsoft.com/en-us/library/system.threading.timeout.infinite.aspx">Timeout.Infinite</a> übergeben,
was dem Aufruf der Funktion Monitor.TryEnter(Object) entspräche.<br /><h1>Einige Beispiele
</h1>
Um die Funktionsweise der einzelnen Methoden der Monitor-Klasse zu verdeutlichen,
werde ich einige Beispiele anführen. Beginnen wir mit einfacheren Verwendung des Monitors.
Wir nehmen einen Konsolenanwendung und erweitern diese mit der Klasse AsyncTest. In
dieser Klasse sind zwei Methoden enthalten, Sync1() und Sync2(). Beide Methoden greifen
auf dasselbe lock-Objekt zu. nämlich lock1.<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Main( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span>[]
args ) { AsyncTest test <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> AsyncTest(
); Thread thread1 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Thread( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> ThreadStart(
test.Sync1 ) ); Thread thread2 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Thread( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> ThreadStart(
test.Sync2 ) ); thread1.Start( ); thread2.Start( ); Console.ReadLine( ); } } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> AsyncTest
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">object</span> lock1 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">object</span>(
); <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync1(
) { Monitor.Enter(lock1); <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> ( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 1;
i &lt;= 20; i++ ) { Console.Write( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"1
{0}|"</span>, i ); Thread.Sleep( 20 ); } Monitor.Exit( lock1 ); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync2(
) { Monitor.Enter( lock1 ); <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> ( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 1;
i &lt;= 20; i++ ) { Console.Write( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"2
{0}|"</span>, i ); Thread.Sleep( 20 ); } Monitor.Exit( lock1 ); } } </span></pre>Die
Ausgabe der beiden Threads erfolgt sequenziell, wie bereits im ersten Teil erklärt.<br /><p></p><img src="http://www.dotnetphen.com/blog/content/binary/SyncLock.PNG" border="0" /><br /><br />
Schauen wir uns im nächsten Beispiel die Funktionsweise der Methode TryEnter an. Thread
2 in der Main-Routine führt nun die Methode Sync3 in der Klasse AsyncTest aus. Diese
versucht über den Aufruf von Monitor.TryEnter(lock1) eine Sperre auf das Objekt zu
bekommen.<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Main( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span>[]
args ) { AsyncTest test <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> AsyncTest(
); Thread thread1 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Thread( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> ThreadStart(
test.Sync1 ) ); Thread thread2 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> Thread( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span> ThreadStart(
test.Sync3 ) ); thread1.Start( ); thread2.Start( ); Console.ReadLine( ); } } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> AsyncTest
{ <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">private</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">object</span> lock1 <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">new</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">object</span>(
); <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync1(
) { Monitor.Enter(lock1); <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">for</span> ( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> i <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 1;
i &lt;= 20; i++ ) { Console.Write( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"1
{0}|"</span>, i ); Thread.Sleep( 20 ); } Monitor.Exit( lock1 ); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync3(
) { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
Monitor.TryEnter( lock1 ) ) { Console.WriteLine( Environment.NewLine <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Lock
achieved."</span> ); Monitor.Exit( lock1 ); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {
Console.WriteLine( Environment.NewLine <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Lock
cannot be achieved."</span> ); } } } </span></pre>Ergibt:<br /><br /><img src="http://www.dotnetphen.com/blog/content/binary/TryEnter1.PNG" border="0" /><br /><br />
Die Ausgabe zu diesem Beispiel entspricht der Beschreibung der Methode Monitor.TryEnter().
Es wird versucht, eine Sperre auf das übergebene Objekt zu registrieren. Schlägt dies
fehl, kehrt die Methode mit false zurück. Hätte eine Sperre registriert werden können,
wäre true zurückgegeben worden.<br />
Betrachten wir das Verhalten der Methode Sync3() nun einmal mit Übergabe eines Timeouts.
Dieser soll 100 Millisekunden lang sein. Die neue Methode nennen wir Sync4() und verdrahten
sie in der Main-Methode auf den zweiten Thread:<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync4(
) { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
Monitor.TryEnter( lock1, 100 ) ) { Console.WriteLine( Environment.NewLine <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Lock
achieved."</span> ); Monitor.Exit( lock1 ); } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> {
Console.WriteLine( Environment.NewLine <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Lock
cannot be achieved."</span> ); } } </span></pre><br /><img src="http://www.dotnetphen.com/blog/content/binary/TryEnter2.PNG" border="0" /><br /><br />
Wie man sehen kann, kehrt die Methode Sync4 etwas später zurück als Sync3 im vorigen
Beispiel, kann jedoch immer noch keine Sperre registrieren. Betrachten wir die Funktion
Sync1 genauer, wird auch schnell klar, warum. Sie dauert bei 20 Schleifendurchläufen
mit jeweils einem Sleep von 20 Millisekunden mindestens 400 Millisekunden. 
<br />
Setzen wir nun also den Timeout in Sync4 auf 1000 Millisekunden.<br /><br /><img src="http://www.dotnetphen.com/blog/content/binary/TryEnter3.PNG" border="0" /><br /><br />
Wie man sehen kann, war der Timeout nun so lang, dass Sync1 vollständig abgearbeitet
und die Sperre freigegeben werden konnte, bevor der Timeout abgelaufen war. Der zweite
Thread konnte seine Sperre erfolgreich registrieren.<br /><h2>Platzierung der lock-Freigabe Monitor.Exit()
</h2>
Wie man an Hand der Funktionen Sync3 und Sync4 erkennen kann, habe ich die Freigabe
der Sperre nicht an das Ende der Funktion gestellt, sondern an das Ende des Zweigs,
der bei erfolgreicher Registrierung der Sperre angesprungen wird. Wird nämlich die
Funktion Exit(object) auf ein Objekt aufgerufen, für welches der aufrufende Thread
keine Sperre registriert hat, bekommt man von der Runtime eine SynchronizationLockException
vor den Bug geknallt, die man dann behandeln darf.<br />
 <br /><img src="http://www.dotnetphen.com/blog/content/binary/ExitException1.PNG" border="0" /><br /><br />
Um dies zu vermeiden (und um logischeren Code zu schreiben) sollte man allerdings
den von mir gewählten Weg gehen und die Sperre nur dann freigeben, wenn sie auch wirklich
registriert wurde. Außerdem sollte man die Freigabe der Sperre in einem finally-Block
notieren, um auf alles vorbereitet zu sein. Auch wenn irgendwo innerhalb der Critical
Section eine Exception geworfen wird, wird so wenigstens die Sperre freigegeben und
die Chance erhöht, dass sich die Anwendung nicht in einem "Deadlock "aufhängt".<br />
Die richtige Notation für den Monitor wäre also:<br /><pre><span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">public</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> Sync6(
) { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
Monitor.TryEnter( lock1, 1000 ) ) { <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">try</span> { <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//Critical
section</span> } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">finally</span> {
Monitor.Exit( lock1 ); } } <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">else</span> { <span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;">//else-Fall
behandeln</span> } } </span></pre>Und wem bei der Betrachtung dieser Methode das C#
Keyword using in den Kopf kommt, der ist ganz nah bei dem, was sich die .NET-Entwickler
gedacht haben. Ändert man den Timeout von 1000 Millisekunden auf Timeout.Infinite
und lässt den else-Zweig weg, entspricht diese Methode dem lock-Statement. Womit nun
der Unterschied zwischen den drei Methoden Enter, TryEnter und Exit des Monitors sowie
dem lock-Statement hinreichend beschrieben sein sollte.<br /><br />
Fassen wir noch einmal zusammen:<br /><ul><li>
Das lock-Statement wartet, bis es eine Sperre registrieren konnte. Die Freigabe der
Sperre erfolg in einem "finally"-Block (die geschweifte Klammer zu des lock-Blocks).</li><li>
Enter versucht eine Sperre zu registrieren und kehrt sofort zurück. Entweder ist die
Sperre registriert (Rückgabe true) oder eben nicht (Rückgabe false). Auf jeden Fall
muss sich der Programmierer Gedanken im das Exception Handling machen.</li><li>
TryEnter erweitert Enter um die Möglichkeit, einen bestimmten Zeitraum auf eine Sperre
zu warten. Entweder wird die Sperre in diesem Zeitraum registriert (Rückgabe true)
oder die Zeit läuft ab (Rückgabe false). Auch hier muss der Programmierer sich um
das Exception Handling selbst kümmern.<br /></li></ul>
Im nächsten Teil werde ich die restlichen Funktionen der Klasse Monitor beleuchten:
Monitor.Wait(), Monitor.Pulse() und Monitor.PulseAll(). Bis dahin freue ich mich auf
Feedback und/oder Anregungen.<br /><br /><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=9af582e4-a737-4699-aee5-5d356b791896" /></div>
    </content>
  </entry>
  <entry>
    <title>C# XML Documentation</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/06/19/CXMLDocumentation.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,32c2bb2d-086e-4d8b-ace6-89d84bcf2c7d.aspx</id>
    <published>2008-06-19T23:58:44.1539828+02:00</published>
    <updated>2008-06-20T00:05:24.6227328+02:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NET.aspx" />
    <category term="C#" label="C#" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="Common" label="Common" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Common.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">During my nightly coding session working
on my gps class library for my smart phone I started to use the xml decomentation
tags see and seealso. Later on after the "nightly build" I had several warnings that
the compiler could not resolve the types provided inside these tags. But thanks to <a href="http://thoughtpad.net/alan-dean/cs-xml-documentation.html">Alan
Dean and his great artivle about XML documentation in C#</a> my usual sleep amount
wont be decreased as much as I feared 10 minutes before.<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=32c2bb2d-086e-4d8b-ace6-89d84bcf2c7d" /></div>
    </content>
  </entry>
  <entry>
    <title>.Net Micro Framework Team announces .Net Micro Framework 3.0</title>
    <link rel="alternate" type="text/html" href="http://www.dotnetphen.com/blog/2008/06/09/NetMicroFrameworkTeamAnnouncesNetMicroFramework30.aspx" />
    <id>http://www.dotnetphen.com/blog/PermaLink,guid,6c5d50e8-a62f-43a5-9693-d6ead0067e80.aspx</id>
    <published>2008-06-09T12:14:54.9928199+02:00</published>
    <updated>2008-06-09T12:22:36.4995446+02:00</updated>
    <category term=".NET" label=".NET" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NET.aspx" />
    <category term=".Net Micro Framework" label=".Net Micro Framework" scheme="http://www.dotnetphen.com/blog/CategoryView,category,NetMicroFramework.aspx" />
    <category term="C#" label="C#" scheme="http://www.dotnetphen.com/blog/CategoryView,category,C.aspx" />
    <category term="Device" label="Device" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Device.aspx" />
    <category term="Embedded" label="Embedded" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Embedded.aspx" />
    <category term="Microsoft" label="Microsoft" scheme="http://www.dotnetphen.com/blog/CategoryView,category,Microsoft.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Last friday, June 6th, the Microsoft .Net
Microframework Team announced a new version 3.0 of the .Net Micro framework. Several
cool features are supported, for example a file system, toch screen support and the
development environment was changed to VS2008. Have a look at the <a href="http://blogs.msdn.com/netmfteam/archive/2008/06/06/opening-the-net-mf-3-0-kimono.aspx">complete
list of new features</a>. Now I hope that <a href="http://blog.devicesolutions.net/2008/06/06/opening-the-net-mf-30-kimono/">Device
Solutions will update the Tahoe firmware as soon as possible</a> so that I can profit
from the new features.<br /><p></p><img width="0" height="0" src="http://www.dotnetphen.com/blog/aggbug.ashx?id=6c5d50e8-a62f-43a5-9693-d6ead0067e80" /></div>
    </content>
  </entry>
</feed>