<?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>Michael C. Kennedy's Weblog</title>
  <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/" />
  <link rel="self" href="http://www.michaelckennedy.net/blog/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2008-07-02T11:51:01.514875-07:00</updated>
  <author>
    <name>Michael C. Kennedy</name>
  </author>
  <subtitle>.NET and Agile Software Design</subtitle>
  <id>http://www.michaelckennedy.net/blog/</id>
  <generator uri="http://www.dasblog.net" version="2.0.7180.0">DasBlog</generator>
  <entry>
    <title>Dynamic Data Access with LINQ</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,adbc22e0-e1c2-4987-a908-f040d75a8528.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,adbc22e0-e1c2-4987-a908-f040d75a8528.aspx</id>
    <published>2008-07-02T11:08:00.093-07:00</published>
    <updated>2008-07-02T11:51:01.514875-07:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">When I talk about LINQ people often ask
whether it’s possible to have dynamic queries with LINQ. An example of this is presenting
the user with a UI that allows them to optionally filter by some criteria or other
and sort by some criteria. This was straightforward if you built-up a SQL string in
code.<br /><br />
The compiled, static nature of LINQ makes this appear difficult at first. They are
not and this video and sample application shows you how to accomplish just this.<br /><p></p><blockquote><img src="http://www.michaelckennedy.net/blog/content/binary/DynamicLinqScreenShot.jpg" border="0" /><br />
                       
Screen shot of sample application<br /><br /></blockquote><link rel="File-List" href="file:///C:%5CUsers%5Cmkennedy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" /><link rel="themeData" href="file:///C:%5CUsers%5Cmkennedy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" /><link rel="colorSchemeMapping" href="file:///C:%5CUsers%5Cmkennedy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>X-NONE</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:DontVertAlignCellWithSp/>
   <w:DontBreakConstrainedForcedTables/>
   <w:DontVertAlignInTxbx/>
   <w:Word11KerningPairs/>
   <w:CachedColBalance/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--><style><!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--></style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><span style="font-size: 11pt; line-height: 115%; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;;">You
can download the source code here</span>:<br /><br />
           <a href="http://www.michaelckennedy.net/blog/content/binary/Kennedy-Dynamic-Linq.zip">Kennedy-Dynamic-Linq.zip
(88.34 KB)</a><br /><br />
And you can watch the screencast video here:<br /><br />
          <a href="http://www.michaelckennedy.net/Downloads/videos/Kennedy-Dynamic-Linq.wmv">Kennedy-Dynamic-Linq.wmv
(35.7 MB)</a><br /><br />
Of course, if you like this post, please kick it: <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2cadbc22e0-e1c2-4987-a908-f040d75a8528.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2cadbc22e0-e1c2-4987-a908-f040d75a8528.aspx" border="0" alt="kick it on DotNetKicks.com" /></a><br /><br /><br /><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=adbc22e0-e1c2-4987-a908-f040d75a8528" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Commercial Skip and Instant Replay for Any Computer (Not Just Media Center Anymore)</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,11caa15a-b9f2-4adb-a1d8-10ab0425b55f.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,11caa15a-b9f2-4adb-a1d8-10ab0425b55f.aspx</id>
    <published>2008-06-02T05:43:35.266-07:00</published>
    <updated>2008-06-05T07:02:41.0155-07:00</updated>
    <category term="Tools" label="Tools" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Tools.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Do you watch a lot of video on your computer?
I sure do. I download conference talks and interviews. I especially watch a lot of
TV recorded by my Windows Media Center PC by copying the video files to my laptop.
Media Center is SO much better than TiVo because you can copy / transfer / save video
to other places (like your laptop).<br /><p></p><div align="center"><img src="http://www.michaelckennedy.net/blog/content/binary/mcesetup.jpg" border="0" /><br />
A cool Media Center Setup (love it!)<br /></div><br />
That’s all well and good, except I really miss the ability to skip commercials and
pause video via my media center remote control.<br /><br /><div align="center"><img src="http://www.michaelckennedy.net/blog/content/binary/MCERemote.jpg" border="0" /><br />
Media Center Remote (love this too!)<br /></div><br />
That’s been a pain to say the least inside Windows Media Player. Well goodbye days
of frustrating commercials and TV via the mouse!<br /><br /><b>Introducing “Minimalist TV Player” (by me!):</b><br /><br /><div align="center"><img src="http://www.michaelckennedy.net/blog/content/binary/Screen.jpg" border="0" /><br /></div><br />
It looks like Windows Media Player and has the same basic features for playing video. 
<br /><br />
But – you can control it like a Media Center TV to <u>skip commercials and replay
an action scene</u> (like the crash shown above at the last Indy 500, just jump back
15 seconds to see the replay)!<br /><br />
You can use the keys PageUp to jump back 15 seconds and PageDown to skip commercials
(forward 30 seconds). That’s a good start. But, if you have one of these presentation
remotes: 
<br /><br /><div align="center"><img src="http://www.michaelckennedy.net/blog/content/binary/presentation_remote_thumb.jpg" border="0" /><br />
Wireless presentation remote 
<br />
(approx $39)<br /></div><br />
Then you can use it to control the TV Player like a Media Center Remote! Here’s the
control mapping:<br /><br /><br /><div align="center"><img src="http://www.michaelckennedy.net/blog/content/binary/presentation_remote_controls.jpg" border="0" /><br />
Controls for the TV Player<br /></div><br />
Now you have the same controls as your Media Center PC on any computer that has Windows
Media Player installed! How cool is that?<br /><br />
Download the beta 1 version here:  <a href="http://www.michaelckennedy.com/Downloads/Tools/TVPlayer/MinimalistTVPlayer.zip">MinimalistTVPlayer
(128 KB)</a><br /><br />
This beta version is fully functional but will expire in 2009. The supported file
types depends somewhat on your system. The program will play any video files that
your Windows Media Player can play. This usually includes WMV, MPG, AVI, and possibly
DVR-MS files from Windows Media Center and DivX if you have the decoder installed.<br /><br />
One final tip: You can associate the application with your video file types and choose
“Open With” to directly launch the program from a file: 
<br /><br /><img src="http://www.michaelckennedy.net/blog/content/binary/AddToOpenWith.jpg" border="0" /><br /><br />
Just be careful to <b>not </b>set the TV Player as the default program to load your
video with unless that’s what you want.<br /><br />
If you this program, be sure to help promote it by kicking it! <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c11caa15a-b9f2-4adb-a1d8-10ab0425b55f.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c11caa15a-b9f2-4adb-a1d8-10ab0425b55f.aspx" alt="kick it on DotNetKicks.com" border="0" /></a><br /><br />
[Update June 5, 2008: I'm working on a <a href="http://services.michaelckennedy.net/Files/beta2.png" target="_blank">much
slicker UI</a> which I'll try to get out soon.]<br /><br /><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=11caa15a-b9f2-4adb-a1d8-10ab0425b55f" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>More on the ThreadPool Bug in .NET 2.0 SP1</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,859d9d70-e822-418f-820c-ca91bed78dcf.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,859d9d70-e822-418f-820c-ca91bed78dcf.aspx</id>
    <published>2008-04-17T09:31:28.796-07:00</published>
    <updated>2008-04-28T07:35:40.343625-07:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">There appears to be some confusion about
this .NET 2.0 SP1 ThreadPool bug I found. Can you believe <a target="_blank" href="http://www.xkcd.com/386/">someone
might be wrong on the internet</a>?<br /><br />
If you’ve been following the posts (<a target="_blank" href="http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx">1</a>, <a target="_blank" href="http://www.michaelckennedy.net/blog/PermaLink,guid,040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx">2</a>, <a target="_blank" href="http://www.michaelckennedy.net/blog/PermaLink,guid,f57cf127-7bf7-445e-bef4-14c3598f92eb.aspx">3</a>),
then you’ll know I was in touch with the key guys at Microsoft and the root of the
problem is that if you create asynchronous work faster than the ThreadPool can create
threads, then that work "misses" the SetMinThreads command and are created more slowly.<br /><br />
That is why the Thread.Sleep(1) probably solves the issue for you. If it doesn’t,
sleep slightly longer. It’s a timing issue.<br /><br />
With this insight, you’ll see that this does not really affect true servers such as
ASP.NET and WCF but does affect things like Delegate.BeginInvoke and friends called
in quick succession. 
<br /><br />
In short, if your server handles more than 1,000 requests per second, during the first
second of startup, then your server may run into this problem (ok, ok, more precisely,
if your server handles more than 1 request / millisecond).<br /><br />
Let me address a few common concerns out there:<br /><ul><li>
Is the sky falling? No.</li><li>
Is it great situation? No.</li><li>
Will be fixed with .NET 2.0 SP2? Yes</li><li>
When? Maybe this summer, maybe later - they aren’t sure.</li><li>
Does this affect WCF and ASP.NET? Probably not. <a target="_blank" href="http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx">The
bug</a>, no. The <a target="_blank" href="http://www.michaelckennedy.net/blog/PermaLink,guid,55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx">new
ThreadPool behavior</a>, yes.</li><li>
Is there a work around? Yes, create threads more slowly. This is automatic on the
server.</li></ul><p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c859d9d70-e822-418f-820c-ca91bed78dcf.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c859d9d70-e822-418f-820c-ca91bed78dcf.aspx" alt="kick it on DotNetKicks.com" border="0" /></a></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=859d9d70-e822-418f-820c-ca91bed78dcf" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Top 5 Most Important Sessions from Mix 08 (with Video)</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,bbaa3ddd-0b26-4159-9902-404080a115fa.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,bbaa3ddd-0b26-4159-9902-404080a115fa.aspx</id>
    <published>2008-04-04T07:16:07.937-07:00</published>
    <updated>2008-04-04T07:40:29.4065-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">You may have heard that the sessions for
Mix 08 were posted online and you can <a href="http://sessions.visitmix.com/" target="_blank">view
or download them</a> until your heart is content.<br /><br /><a href="http://www.visitmix.com/" target="_blank">Mix 08</a> is becoming an increasingly
important event in the .NET space. I spent a fair amount of time watching the sessions
in the evenings. I was teaching a class and couldn't attend myself. 
<br /><br />
So who wouldn't want to curl up with a cold beer, a warm laptop, and a bunch of .NET
presentations? That's what I want to know. But, maybe you don't have time to go through
all 89 sessions? Don't despair, I'll distill them down for you. 
<br /><br />
BTW, I'd love to link directly to them, but SilverLight and Flash are broken web metaphors
(you can't link their content) so you'll have to find them at <a href="http://sessions.visitmix.com/" target="_blank">http://sessions.visitmix.com/</a>.<br /><br />
Without further ado, I present to you my top 5 most important sessions from Mix 08:<br /><br /><ol><li>
T22 - Developing ASP.NET Applications Using the Model View Controller Pattern<br /><a href="http://www.hanselman.com/blog/" target="_blank">Scott Hanselman</a><br /><br /></li><li>
T01 - Creating a RESTful API with Windows Communication Foundation<br />
Aaron Sloman and Haider Sabri<br /><br /></li><li>
UX03 - The Back of the Napkin: Solving Design Problems (and Selling Your Solutions)
with Pictures<br /><a href="http://www.digitalroam.typepad.com/" target="_blank">Dan Roam</a><br /><br /></li><li>
T11 - What's New in Windows Presentation Foundation 3.5<br /><a href="http://rrelyea.spaces.live.com/" target="_blank">Rob Relyea</a><br /><br /></li><li>
T26 - Building Applicaitons and Services with.NET Framework 3.5<br /><a href="http://www.wintellect.com/cs/blogs/jsmith/" target="_blank">Justin Smith</a></li></ol>
Of course the keynotes were great too - but they don't really belong in this category.<br /><br />
So get out there and learn something! :) And kick it if you like it: <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2f" alt="kick it on DotNetKicks.com" border="0" /></a><br /><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=bbaa3ddd-0b26-4159-9902-404080a115fa" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Top 5 Favorite CodePlex Projects</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,f7710633-f518-49f4-a018-4968dc57db26.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,f7710633-f518-49f4-a018-4968dc57db26.aspx</id>
    <published>2008-03-25T06:43:14.984-07:00</published>
    <updated>2008-03-25T06:51:05.328-07:00</updated>
    <category term="Open Source" label="Open Source" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Open%2BSource.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've been looking around <a href="http://www.codeplex.com">CodePlex </a>lately
and there's some really cool stuff there. For example, the source code to ASP.NET
MVC.<br /><br />
That got me thinking, what else is out there? Here are my (current) top 5 favorite
CodePlex projects.<br /><br /><b>#1. ASP.NET MVC</b><br /><a href="http://www.codeplex.com/aspnet">http://www.codeplex.com/aspnet</a><br />
This project gives you access to the source code for upcoming releases that the Microsoft
ASP.NET team is working on, starting with the ASP.NET MVC Framework. The project gives
you a look at the design and lets you have a voice in it. You can send us feedback
for the ASP.NET MVC framework through the ASP.NET MVC forums on the ASP.NET site. 
<br /><br /><b>#2 Script#</b><br /><a href="http://www.codeplex.com/scriptsharp">http://www.codeplex.com/scriptsharp</a><br />
Script# enables more productive Ajax application development by allowing you to compile
your C# source code into JavaScript. It allows you to use standard .NET tools like
msbuild projects, Visual Studio and IDE intellisense, reflector, refactoring tools,
amongst various others. 
<br /><br /><b>#3 AJAX Control Toolkit</b><br /><a href="http://www.codeplex.com/AtlasControlToolkit">http://www.codeplex.com/AtlasControlToolkit</a><br />
The AJAX Control Toolkit is a joint project between the community and Microsoft. Built
upon the ASP.NET 2.0 AJAX Extensions, the Toolkit aims to be the biggest and best
collection of web-client components available.<br /><br /><b>#4 .NET Mass Downloader</b><br /><a href="http://www.codeplex.com/NetMassDownloader">http://www.codeplex.com/NetMassDownloader</a><br />
Mass Downloader For .Net Framework which allows you do download .Net Framework source
code in batch.<br />
The tool which enables offline debugging of .Net Framework in VS2008(including Express
Editions) , VS2005 (including Express Editions), and Codegear Rad Studio.<br /><br /><b>#5 MVC Contrib - MvcContrib.org</b><br /><a href="http://www.codeplex.com/MVCContrib">http://www.codeplex.com/MVCContrib</a><br />
This project will be a series of assemblies that add functionality to Microsoft's
ASP.NET MVC Framework and make the framework easier to use. *Download the MVC Framework
CTP here: <a href="http://asp.net/downloads/3.5-extensions/">http://asp.net/downloads/3.5-extensions/</a>.
Download here: <a href="http://go.microsoft.com/fwlink/?LinkID=105029">http://go.microsoft.com/fwlink/?LinkID=105029</a>.
Some of the items to be included are ...<br /><br /><b>#5+1 ASP.NET Upload Utility: Big Mailer</b><br /><a href="http://www.codeplex.com/bigmailer">http://www.codeplex.com/bigmailer</a><br />
Email something huge: The big mailer project allows you to upload large files to your
website and then retrieve a convenient url for email and other uses. 
<br /><br /><b>#5+2 Visual Studio Most Recent Files Utility</b><br /><a href="http://www.codeplex.com/vsrecentfiles">http://www.codeplex.com/vsrecentfiles</a><br />
Manage your recent projects and solutions list for Visual Studio. Supports VS 2003,
2005, and 2008. 
<br /><br /><i>[OK, those last two are projects are mine, but they are pretty cool.]</i><br /><br />
Did I miss something spectacular? Add it to the comments below!<br /><br />
- Michael Kennedy<br /><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=f7710633-f518-49f4-a018-4968dc57db26" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Visual Studio Recent Files Utility Now OpenSource on CodePlex</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,4fadba49-e63b-4276-b373-0812faca96fb.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,4fadba49-e63b-4276-b373-0812faca96fb.aspx</id>
    <published>2008-03-24T16:06:27.234-07:00</published>
    <updated>2008-03-24T21:32:47.23425-07:00</updated>
    <category term="Open Source" label="Open Source" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Open%2BSource.aspx" />
    <category term="Tools" label="Tools" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Tools.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">If you'v been using my <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,418ddbe1-bba5-4341-afc8-9fcb78bba6f5.aspx">Visual
Studio Recent Files Utility</a>, then you may be interested to find out that I just
released it as open source on CodePlex here.<br /><br />
    <a href="http://www.codeplex.com/vsrecentfiles">Visual Studio Recent
Files Utility on CodePlex</a><br /><br />
Enjoy!<br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=4fadba49-e63b-4276-b373-0812faca96fb" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Big Mailer Utility is Now Open Source on CodePlex</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,8114c9a1-0d48-44a7-9841-25391ca14b5f.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,8114c9a1-0d48-44a7-9841-25391ca14b5f.aspx</id>
    <published>2008-03-24T13:28:40.64-07:00</published>
    <updated>2008-03-24T21:33:04.54675-07:00</updated>
    <category term="Open Source" label="Open Source" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Open%2BSource.aspx" />
    <category term="Tools" label="Tools" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Tools.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Hi All,<br /><br />
I recently added my <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,3c1f1434-99ea-4b94-9411-d6227c7af1f1.aspx">Big
Mailer</a> project to CodePlex.<br /><br />
     <a href="http://www.codeplex.com/bigmailer">Big Mailer on
CodePlex</a><br /><br />
You can download the source code among other things.<br /><br />
Enjoy!<br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=8114c9a1-0d48-44a7-9841-25391ca14b5f" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Email Something Huge: Introducing the Big Mailer Utility</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,3c1f1434-99ea-4b94-9411-d6227c7af1f1.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,3c1f1434-99ea-4b94-9411-d6227c7af1f1.aspx</id>
    <published>2008-03-17T10:52:54.109-07:00</published>
    <updated>2008-03-24T21:33:23.7655-07:00</updated>
    <category term="Open Source" label="Open Source" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Open%2BSource.aspx" />
    <category term="Tools" label="Tools" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Tools.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I often have to send large files around by email. For example, I had to email a colleague
a 10 MB file. It seems a little rude to hit him out of the blue with a 10 MB email.
I wanted something cleaner and less intrusive.
</p>
        <p>
So I created a simple utility I called "Big Mailer". I figured I'd blog about it and
share it with the world. Feel free to use it as you see fit. This program consists
of both a client and server piece that simplifies uploading content to your web site.
Then the program gives you a regular web link you can send via email. 
</p>
        <p>
Here's a screen shot:
</p>
        <p>
          <img style="border-width: 0px;" alt="BigMailer" src="http://www.michaelckennedy.net/blog/content/binary/BigMailer.png" border="0" />
        </p>
        <p>
You can download and install it via ClickOnce here:
</p>
        <blockquote>
          <p>
            <a href="http://www.michaelckennedy.net/downloads/tools/bigmailer/BigMailer.application">Install
Big Mailer</a> (700 KB)
</p>
        </blockquote>
        <p>
          <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c3c1f1434-99ea-4b94-9411-d6227c7af1f1.aspx">
            <img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c3c1f1434-99ea-4b94-9411-d6227c7af1f1.aspx" alt="kick it on DotNetKicks.com" border="0" />
          </a>
        </p>
        <p>
You <u>must</u> have the following to use this program:
</p>
        <ol>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-4E35-B531-508D977D32A6&amp;displaylang=en" target="_blank">.NET
3.5 Framework</a> installed on the client 
</li>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-4E35-B531-508D977D32A6&amp;displaylang=en" target="_blank">.NET
3.5 Framework</a> on the server 
</li>
          <li>
An <a href="http://www.asp.net" target="_blank">ASP.NET web site</a> to host the WCF
service</li>
        </ol>
        <p>
After you install the client, click "Host Service" and you'll get the server side
code to drop onto your ASP.NET web site. There is a test web site with instructions
in that code.
</p>
        <p>
If you don't have an ASP.NET web site to host the service at you can always use public
services like <a href="http://www.dropboks.com" target="_blank">Drop Boks</a> (a great
service!) or other file sharing sites. The benefit of this program / service is that
you retain control of the files and you can conceivably send more sensitive content.
</p>
        <p>
You can also just use FTP if you have that for your web site, but I hate FTP personally.
I don't like fighting the firewall issues and I don't want it running on my servers.
</p>
        <p>
So this program allows you to upload content of unlimited size, without FTP, without
sending your files to a third party. Also, it sends everything in 16KB blocks, rather
than one giant http message. So you get the benefit of both being able to send huge
files (say 1 GB) and you get progress / cancel support.
</p>
        <p>
One feature that's notably lacking is authentication. I'll probably release an update
with security built-in. For now, take that into consideration before using it.
</p>
        <p>
Enjoy!
</p>
PS - This project is now <a href="http://www.codeplex.com/bigmailer">Open Source and
is host on CodePlex</a>.<br /><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=3c1f1434-99ea-4b94-9411-d6227c7af1f1" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Follow up on .NET 2.0 SP1 ThreadPool Bug</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,f57cf127-7bf7-445e-bef4-14c3598f92eb.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,f57cf127-7bf7-445e-bef4-14c3598f92eb.aspx</id>
    <published>2008-03-03T11:49:40.406-08:00</published>
    <updated>2008-03-06T15:15:38.0155-08:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Here's a followup post on the .NET ThreadPool
bug that I described here:<br /><br /><a class="TitleLinkStyle" rel="bookmark" href="PermaLink,guid,040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx">Breaking
Changes in the ThreadPool: The Movie</a><br /><br />
I have been in touch with the guys who are in charge of the ThreadPool and they have
both confirmed that this is a bug and that they are planning on fixing it in .NET
2.0 SP2 - but they are not sure of the timeline for its release.<br /><br />
In the meantime, Vance Morrison, a .NET Runtime Performance Architect at Microsoft,
has given me this work-around.<br /><br />
Take this "broken" code:<br /><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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> UseThreadPool(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> count)<br />
        {<br />
            <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> 0;
i &lt; count; i++ )<br />
            {<br />
                ThreadPool.QueueUserWorkItem(<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">delegate</span> {
SlowMethod(); } );<br />
            }<br />
        }</span></pre>
And add a strategic Thread.Sleep and it's fixed:<br /><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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> UseThreadPool(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> count)<br />
        {<br />
            <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> 0;
i &lt; count; i++ )<br />
            {<br />
                ThreadPool.QueueUserWorkItem(<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">delegate</span> {
SlowMethod(); } );<br />
Thread.Sleep(1);<br />
            }<br />
        }</span></pre><br /><br /><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=f57cf127-7bf7-445e-bef4-14c3598f92eb" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Breaking Changes  in the ThreadPool: The Movie</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx</id>
    <published>2008-02-26T10:21:04.984-08:00</published>
    <updated>2008-02-26T10:29:53.187375-08:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Well, my recent post on <a class="TitleLinkStyle" rel="bookmark" href="PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx">.NET
3.5 Brings BREAKING Changes to ThreadPool</a> sparked quite a bit of interest in the
.NET community.<br /><br />
But this is also something difficult to convince people of because it depends so heavily
on configuration. The source code doesn't change, the environment does.<br /><br />
So I've put together a screencast demonstrating the problem and elaborating further.
If you doubt the validity of the previous post, or can't reproduce the problem, please
watch the video:<br /><br /><br /><a href="http://www.michaelckennedy.net/Downloads/videos/KennedyFollowupNet35ThreadPool.wmv"><img src="http://www.michaelckennedy.net/blog/content/binary/VideoSnapshot.png" border="0" /></a><br /><br />
                     <a href="http://www.michaelckennedy.net/Downloads/videos/KennedyFollowupNet35ThreadPool.wmv">Download
the video</a> (approx 18 MB)<br /><br />
Kick it: <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx" alt="kick it on DotNetKicks.com" border="0" /></a><br /><br />
In the video I work with a modified version of the program. Here's that for your enjoyment:<br /><br />
The application: <a href="http://www.michaelckennedy.net/blog/content/binary/NetThreading%20%28From%20Video%29.zip">NetThreading.exe
(From Video).zip (2.59 KB)</a><br /><br />
The source code:<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;">using</span> System;<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System.Threading;<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">namespace</span> NewThreadPoolBehavior<br />
{<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">internal</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program<br />
    {<br />
        <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;">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)<br />
        {<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Running
on "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> Environment.Version
);<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> w,
c;<br />
            ThreadPool.GetMaxThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Max
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br />
            ThreadPool.GetMinThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Min
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br /><br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Set
min thread count 20? (y/n) "</span> );<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span> txt <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Console.ReadLine();<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
txt == <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"y"</span> )<br />
            {<br />
                Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Setting
min to 20"</span> );<br />
                ThreadPool.SetMinThreads(
20, 100 );<br />
                ThreadPool.GetMinThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
                Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Min
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br />
            }<br />
            UseThreadPool(
200 );<br /><br />
            Console.ReadLine();<br />
        }<br /><br />
        <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;">static</span> DateTime
startTime;<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> UseThreadPool(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> count)<br />
        {<br />
            startTime <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> DateTime.Now;<br />
            <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> 0;
i &lt; count; i++ )<br />
            {<br />
                ThreadPool.QueueUserWorkItem(<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">delegate</span> {
SlowMethod(); } );<br />
            }<br />
        }<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> concurrent <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> SlowMethod()<br />
        {<br />
            TimeSpan dt <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> DateTime.Now <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">-</span> startTime;<br />
            concurrent++;<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Starting
ops ("</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> concurrent <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;">"
concurrent, elapsed="</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+<br /></span>dt.TotalSeconds.ToString( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"N3"</span> ) <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;">"
sec.) "</span> );<br />
            Thread.Sleep(
20000 );<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Finished
ops ("</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> concurrent <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;">"
concurrent)"</span> );<br />
            concurrent--;<br />
        }<br />
    }<br />
}</span></pre><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=040a74fe-6ea5-46fb-b3cb-049030ffd8c3" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>.NET 3.5 Brings Breaking Changes to ThreadPool</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx</id>
    <published>2008-02-25T15:47:28.656-08:00</published>
    <updated>2008-05-14T06:32:48.17175-07:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Holy smokes! I thought we had figured out
something significant when I posted <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx">.NET
3.5 Brings Major (Undocumented) Changes to ThreadPool</a> where we discovered that
the .NET 3.5 ThreadPool changed the allocation algorithm for adding threads from linear
to logarithmic.<br /><br />
This is <b>bigger</b>. [Recently updated <a href="#update">see note below</a>]<br /><br />
Here's the scenario. I have a server - say in the financial sector - that must process
many requests and it must get up to speed immediately. I can't pay the 500 ms warm
up time for the ThreadPool (.NET 2.0) or the even slower model in .NET 2.0 SP1. What
do I do? I call ThreadPool.SetMinThreads(x, x) where x &lt; (the current max), but
much higher than 2 (the default). So I might call ThreadPool.SetMinThreads(100, 100)
or something like that.<br /><br />
In .NET 1.0 - .NET 2.0 (without SP1) you would go from the warm up time model:<br /><br /><a href="http://www.michaelckennedy.net/blog/content/binary/Net20sp0WithNoMinThreads.png"><img src="http://www.michaelckennedy.net/blog/content/binary/Net20sp0WithNoMinThreads_Thumb.png" border="0" /></a><br /><b>                
warm up time model (.NET 2.0)</b><br /><br />
To this immediate "ready" threading model.<br /><p></p><p></p><p></p><p></p><a href="http://www.michaelckennedy.net/blog/content/binary/Net20sp0WithMinThreads.png"><img src="http://www.michaelckennedy.net/blog/content/binary/Net20sp0WithMinThreads_Thumb.png" border="0" /></a><br /><b>                
ready model (.NET 2.0)<br /></b><br />
Notice that we immediately have 100 threads available in this case. BUT, and here's
the but: .NET 3.5 (read .NET 2.0 SP1) <b>*ignores*</b> SetMinThreads. Oh, it claims
to respect SetMinThreads:<br /><br />
   Running on 2.0.50727.1433<br />
   Max Currently: 500, 1000<br />
   Min Currently: 2, 2<br />
   Set min thread count 100 (y/n)? y<br />
   Setting min to 100<br />
   Min Currently: 100, 100<br /><br />
But, look at the thread graph that results!<br /><br /><a href="http://www.michaelckennedy.net/blog/content/binary/Net35WithMinThreads.png"><img src="http://www.michaelckennedy.net/blog/content/binary/Net35WithMinThreads_Thumb.png" border="0" /></a><br /><b>           ready model (.NET
2.0 SP1  -- i.e. .NET 3.5)<br /></b><br />
I don't know about you, but that doesn't look any different AT ALL than if we <b>do
not </b>call SetMinThreads:<br /><br /><a href="http://www.michaelckennedy.net/blog/content/binary/Net35NotMinThreads.png"><img src="http://www.michaelckennedy.net/blog/content/binary/Net35NotMinThreads_Thumb.png" border="0" /></a><br /><b>         warm up time model </b><b> (.NET
2.0 SP1  -- i.e. .NET 3.5)<br /><br /></b>What do we conclude from this? <b><u>.NET 2.0 SP1 does not respect ThreadPool.SetMinThreads</u></b>.
To me, that's a big breaking change. My financial app just stopped working. Yikes!
So what happened to my thread pool and SetMinThreads in .NET 2.0 SP1? Anyone?<br /><br />
Kick it: <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx" alt="kick it on DotNetKicks.com" border="0" /></a><br /><br />
Don't take my word for it. Run this program on both .NET 2.0 (SP0) and .NET 2.0 SP1
and you'll see for yourself.<br /><br />
Here's the EXE:<br /><br />
   <a href="http://www.michaelckennedy.net/blog/content/binary/NetThreading.zip">NetThreading.zip
(2.3 KB)</a><br /><br />
And the source code is below:<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;">using</span> System;<br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">using</span> System.Threading;<br /><br /><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">namespace</span> NewThreadPoolBehavior<br />
{<br />
    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">internal</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">class</span> Program<br />
    {<br />
        <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;">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)<br />
        {<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Running
on "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> Environment.Version
);<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> w,
c;<br />
            ThreadPool.GetMaxThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Max
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br />
            ThreadPool.GetMinThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Min
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br /><br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Set
min thread count 100? (y/n) "</span> );<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">string</span> txt <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> Console.ReadLine();<br />
            <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">if</span> (
txt == <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"y"</span> )<br />
            {<br />
                Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Setting
min to 100"</span> );<br />
                ThreadPool.SetMinThreads(
100, 100 );<br />
                ThreadPool.GetMinThreads( <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> w, <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">out</span> c
);<br />
                Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Min
Currently: "</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> w <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;">",
"</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> c
);<br />
            }<br />
            UseThreadPool(
200 );<br /><br />
            Console.ReadLine();<br />
        }<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> UseThreadPool(<span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> count)<br />
        {<br />
            <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> 0;
i &lt; count; i++ )<br />
            {<br />
                ThreadPool.QueueUserWorkItem(<br />
                    <span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">delegate</span> {
SlowMethod(); } );<br />
            }<br />
        }<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">int</span> concurrent <span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">=</span> 0;<br /><br />
        <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;">static</span><span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;">void</span> SlowMethod()<br />
        {<br />
            concurrent++;<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Starting
ops ("</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> concurrent <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;">"
concurrent)"</span> );<br />
            Thread.Sleep(
20000 );<br />
            Console.WriteLine( <span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Finished
ops ("</span><span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;">+</span> concurrent <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;">"
concurrent)"</span> );<br />
            concurrent--;<br />
        }<br />
    }<br />
}</span></pre>
[<a name="update">Update: 2/25/2008</a> - You may be thinking so what's the big deal?
Most applications don't directly program against the ThreadPool so this is just some
edge case. To make this more real for everyone, this applies to you if you use any
of the following: <b>ASP.NET, WCF, .NET Remoting, Delegate.BeginInvoke, SqlCommand.BeginExecute*,
Windows Workflow</b>, and more. Sounds serious now right?]<br /><br />
[Update: 5/12/2008 - Please see my lastest followup on this topic: <a class="TitleLinkStyle" rel="bookmark" href="PermaLink,guid,859d9d70-e822-418f-820c-ca91bed78dcf.aspx">More
on the ThreadPool Bug in .NET 2.0 SP1</a>.]<br /><br /><br /><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>.NET 3.5 Brings Major (Undocumented) Changes to ThreadPool</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx</id>
    <published>2008-02-06T21:33:32.218-08:00</published>
    <updated>2008-06-04T06:59:38.06275-07:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img src="http://www.michaelckennedy.net/blog/content/binary/willy.jpg" style="border: thin solid rgb(0, 0, 0);" align="right" width="128" /> It
was all going so smoothly. <a href="http://develop.com/us/technology/bio.aspx?id=52"> Jason
Whittington</a>, <a href="http://develop.com/us/technology/bio.aspx?id=98">Mark Smith</a> and
I were teaching the big <a href="http://www.develop.com">DevelopMentor</a> event here
in Los Angeles (<a href="http://www.develop.com/us/training/course.aspx?id=273">Guerrilla.NET</a>)
when my presentation on the <a href="http://msdn2.microsoft.com/en-us/library/system.threading.threadpool.aspx">ThreadPool</a> took
a nose dive. It started with a great joke involving Wilson (the volleyball from <a href="http://www.imdb.com/title/tt0162222/"><i>Cast
Away</i></a>). 
</p>
        <p>
Wilson and I built an application to compute a multiplication table where each computation
was (artificially) slow. To speed it up we threw it at the thread pool using <font face="Courier New"><b>delegate.BeginInvoke</b></font>.
We figured that the ThreadPool would allocate 25 or so threads and the table would
display quickly. Here's the expected output - pretty much the same thing we've seen
since about .NET 1.0: 
</p>
        <p>
    <img src="http://www.michaelckennedy.net/blog/content/binary/Matrix.png" style="border: thin solid rgb(0, 0, 0);" /></p>
        <p>
Each color represents the thread that did that computation. 
</p>
        <p>
For the last 7 years, the behavior has been that as the ThreadPool was overloaded,
it would steadily start up new threads at the rate of one every 500 milliseconds until
it hits its upper limit (typically). Using Performance Monitor (perfmon) we can watch
the thread pool adding threads. It usually looks something like this: 
</p>
        <p>
    <img src="http://www.michaelckennedy.net/blog/content/binary/old_perfmon.png" style="border: thin solid rgb(0, 0, 0);" /></p>
        <p>
Much to our surprise we saw completely different behavior. The thread pool added the
first 15 or so threads quickly (as expected) but then stalled. New threads were <i>not</i> created
every 500ms, instead they were added at increasingly long intervals. My demo took
almost <i>twice</i> as long to run as it had the last time I did this demo a few months
ago. 
</p>
        <p>
Jason, Mark, and I took this code, ported it back to .NET 1.1 and ran it side-by-side
with .NET 3.5 and here's what we saw (blue = 3.5, red = 1.1): 
</p>
        <p>
    <img src="http://www.michaelckennedy.net/blog/content/binary/perfmon.PNG" style="border: thin solid rgb(0, 0, 0);" /></p>
        <p>
As of .NET 3.5 the upper limit of the ThreadPool was increased: <a href="http://www.bluebytesoftware.com/blog/2007/03/05/WhyTheCLR20SP1sThreadpoolDefaultMaxThreadCountWasIncreasedTo250CPU.aspx"> Knew
that</a>. 
</p>
        <p>
But, it appears that v3.5 of the CLR changes the policy for adding threads to the
thread pool. Rather than adding threads regularly when under load the thread pool
uses a logarithmic backoff. My colleague Jason Whittington remarked that this behavior
looked similar to the behavior of the thread pool in <a href="http://research.microsoft.com/sscli">"Rotor"</a> (the
shared-source version of the CLR). We speculated that this backoff algorithm makes
sense given the new 250-thread per CPU maximum - it would take a long time to reach
that if the runtime waits longer and longer to start a new thread. The 250-thread
limits makes it less likely that your application will deadlock the thread pool, and
the exponential backoff algorithm keeps the thread pool from creating too many threads
too quickly. 
</p>
        <p>
Why should you care? Usually you won't, but it could have dramatic impact if you count
on that behavior. For example, in our contrived case, <b>.NET 1.1 ran about twice
as fast as .NET 3.5 ( ! )</b>: 
</p>
        <p>
    <img src="http://www.michaelckennedy.net/blog/content/binary/console_trimmed.png" style="border: thin solid rgb(0, 0, 0);" /></p>
        <p>
Here's the program and source code (trimmed down to run in both .NET 1.1 and 3.5). 
</p>
        <p>
    <a href="http://www.michaelckennedy.net/blog/content/binary/Math.zip">Math.zip</a> (6.38
KB) 
</p>
        <p>
Needless to say, Wilson and I felt kinda stood up. 
</p>
        <p>
    <img src="http://www.michaelckennedy.net/blog/content/binary/WilsonAndMe.png" style="border: thin solid rgb(0, 0, 0);" />  <a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.michaelckennedy.net%2fblog%2fPermaLink%2cguid%2c55a9b21e-ae85-4c24-a0b6-63dff4a6b491.aspx" alt="kick it on DotNetKicks.com" border="0" /></a></p>
        <p>
Please see the follow up post <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx">on
Breaking changes</a> and now there is <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,040a74fe-6ea5-46fb-b3cb-049030ffd8c3.aspx">screencast,
movie version</a> as well. 
<br /></p>
        <p>
          <br />
        </p>
        <img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=55a9b21e-ae85-4c24-a0b6-63dff4a6b491" />
        <br />
        <hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Guerrilla.NET Demos and Challenges</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,3836a4a4-b933-4cb4-bfdb-50b35fac321d.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,3836a4a4-b933-4cb4-bfdb-50b35fac321d.aspx</id>
    <published>2008-02-06T09:09:38.687-08:00</published>
    <updated>2008-02-13T09:11:54.35925-08:00</updated>
    <category term="DevelopMentor" label="DevelopMentor" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,DevelopMentor.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Thanks to everyone who attended Guerrilla
.NET last week. I had a great time meeting all of you. Here are the slides and demos
from all our presentations.<br /><br />
     <a href="content/binary/Demos.rar">Demos.rar</a> (22 MB)<br /><br />
    <a href="content/binary/Challenge.rar">Challenge.rar</a> (8 MB)<br /><br />
- Michael<br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=3836a4a4-b933-4cb4-bfdb-50b35fac321d" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Introducing ASP.NET MVC (Model View Controller)</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,e027b5b4-3329-4456-b734-79f4917c88a8.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,e027b5b4-3329-4456-b734-79f4917c88a8.aspx</id>
    <published>2008-01-30T07:49:49.338-08:00</published>
    <updated>2008-01-30T07:49:49.3385894-08:00</updated>
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I recently wrote up an overview of the new
ASP.NET MVC Framework for the Developments newsletter.<br /><br />
I encourage you to <a href="http://www.develop.com/email/developments/developmentsfinal010908.htm">read
it on the DevelopMentor website</a>. It's an interesting programming model.<br /><br /><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=e027b5b4-3329-4456-b734-79f4917c88a8" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>System.Transactions and Windows Vista NTFS (Updated)</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,80141ef3-36e2-43ca-8d5d-a1b5217b5859.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,80141ef3-36e2-43ca-8d5d-a1b5217b5859.aspx</id>
    <published>2007-12-06T20:51:52-08:00</published>
    <updated>2007-12-07T06:09:41.999625-08:00</updated>
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've been playing with my fresh copy of
Vista Ultimate - which I am surprised to find that I absolutely love.<br /><br />
Being a big fan of System.Transactions, I naturally wanted to use it with Vista's
TxF (Transactional NTFS) file system. But unlike the data libraries, the file APIs
don't auto-enlist in the transaction. In fact, there are only COM / PInvoke APIs currently.<br /><br />
There is a nice article about how to work with these APIs in the MSDN article: <a href="http://msdn.microsoft.com/msdnmag/issues/07/07/NTFS/default.aspx">"NTFS:
Enhance Your Apps With File System Transactions"</a>. But I was unimpressed with the
managed wrapper they created there. In particular, I don't like that the lifetime
of the file stream is not forced to be part of a client initiated transaction scope.
So I built my own transactional file stream in C#. With this TxFileStream class, you
can write succinct code like this:<br /><br /><p><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent;">[Test]<br /></span><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent;"><span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">public</span><span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">void</span> ContentAddedDoesNotPersistsAfterRollbackTest()<br />
{<br />
    <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">string</span> fileName <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span><span style="font-size: 11px; color: rgb(102, 102, 102); font-family: courier new; background-color: rgb(228, 228, 228);">"file3.txt"</span>;<br />
    <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">string</span> originalContents <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span><span style="font-size: 11px; color: rgb(102, 102, 102); font-family: courier new; background-color: rgb(228, 228, 228);">"First
contents"</span>;<br />
    
<br />
    <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">using</span> (TransactionScope
scope <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span><span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">new</span> TransactionScope())<br />
    {<br />
        <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">string</span> newContents <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span><span style="font-size: 11px; color: rgb(102, 102, 102); font-family: courier new; background-color: rgb(228, 228, 228);">"Hello
transacted NTFS."</span>;<br />
        <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">using</span> (StreamWriter
sw <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span> TxFileStream.CreateWriter(fileName))<br />
        {<br />
            sw.Write(newContents);<br />
        }<br /><br />
        <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">using</span> (StreamReader
sr <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span> TxFileStream.CreateReader(fileName))<br />
        {<br />
            <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent;">string</span> text <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent;">=</span> sr.ReadToEnd();<br />
            Assert.That(text,
Is.EqualTo(<u><i><b>newContents</b></i></u>));<br />
        }<br />
        <span style="font-size: 11px; color: green; font-family: courier new; background-color: transparent;">//
no call to scope.Complete() forces a rollback.</span><br />
    }<br /><br />
    Assert.That(File.Exists(fileName));<br />
    Assert.That(File.ReadAllText(fileName), 
<br />
        Is.EqualTo(<u><i><b>originalContents</b></i></u>));<br />
}</span></p><br />
Feel free to download the code and give it a spin! 
<p></p><p>
    <a href="http://www.michaelckennedy.net/blog/content/binary/Kennedy.TxFiles.zip">Kennedy.TxFiles.zip
(36 KB)</a><br /><br />
Of course, my library comes with comprehensive unit tests. Look here first to figure
out how out use the library.<br /><br /><img src="http://www.michaelckennedy.net/blog/content/binary/TxTestResults.png" border="0" /></p><p><b>Note</b>: I fixed a bug in creating transactional StreamWriter's in append mode.
Previously they partially overwrote the existing content.
</p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=80141ef3-36e2-43ca-8d5d-a1b5217b5859" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Visual Studio Tricks Series: #3 Managing the Recent Projects List</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,418ddbe1-bba5-4341-afc8-9fcb78bba6f5.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,418ddbe1-bba5-4341-afc8-9fcb78bba6f5.aspx</id>
    <published>2007-09-12T18:27:40.843-07:00</published>
    <updated>2008-03-24T21:32:29.093625-07:00</updated>
    <category term="Tools" label="Tools" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Tools.aspx" />
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <category term="Open Source" label="Open Source" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Open%2BSource.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <font size="5">W</font>elcome to my third
Visual Studio tricks post. This time it's more of a utility, than a tip. I want to
talk about managing the recently projects list. If you're like me, then you work with
many different projects (especially after I teach a class) and your recent project
list becomes polluted with projects you don't care about.<br /><br />
      <img src="http://www.michaelckennedy.net/blog/content/binary/StartPage.png" border="0" /><br /><br /><br />
In this post, <a href="http://blogs.msdn.com/gduthie/archive/2006/01/10/511346.aspx">"Recent
Projects in Visual Studio 2005"</a>, .net DEvHammer discusses how to access the registry
to alter that list.<br /><br />
Well, I didn't feel like going to the registry everytime I wanted to clean that list.
So I whipped up a simple UI to manage that list (basically manage that registry list).<br /><br /><br /><img src="http://www.michaelckennedy.net/blog/content/binary/Visual%20Studio%20Recent%20File%20Snap.png" border="0" /><br /><br />
You're welcome to <a href="http://www.michaelckennedy.net/downloads/tools/VisualStudioMruUtility/VisualStudioMruFileUtil.application">download
this program </a>if it looks useful to you. I decided to publish it via <a href="http://msdn.microsoft.com/clickonce">ClickOnce</a> so
it will always be up-to-date. If you're using FireFox, you'll need to <a href="https://addons.mozilla.org/en-US/firefox/addon/1608">FFClickOnce </a>add-on
to make this work.<br /><br />
    <a href="http://www.michaelckennedy.net/downloads/tools/VisualStudioMruUtility/VisualStudioMruFileUtil.application">Install
Visual Studio Recent Files Utility</a> (approx 200 KB)<br /><br /><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.codeplex.com%2fvsrecentfiles"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.codeplex.com%2fvsrecentfiles" alt="kick it on DotNetKicks.com" border="0" /></a><br /><br />
I hope you enjoy it!<br /><br />
This project is now hosted on <a href="http://www.codeplex.com/vsrecentfiles">CodePlex
and is Open Source</a>.<img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=418ddbe1-bba5-4341-afc8-9fcb78bba6f5" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Visual Studio Tricks Series: #2 Multiple Startup Projects</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,bfb08f1b-c7b8-4c13-b0a3-f9cfdb4508b9.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,bfb08f1b-c7b8-4c13-b0a3-f9cfdb4508b9.aspx</id>
    <published>2007-08-22T08:09:55.359-07:00</published>
    <updated>2007-08-22T08:09:55.359375-07:00</updated>
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <font size="5">W</font>elcome to the next
installment of my Visual Studio Tricks series. Continuing on from <a href="http://www.michaelckennedy.net/Blog/Default.aspx#aef718e55-62fb-404a-b685-0136306a0afe">last
time</a> when I discussed how to quickly switch between startup projects using hot-keys,
we'll cover another startup project trick.<br /><br />
Here's the scenario. Suppose you're working on a brand new WCF application that has
both a client and server piece.<br /><br />
         <img src="http://www.michaelckennedy.net/blog/content/binary/SolutionExplorer.PNG" border="0" /><br /><br />
You need to start both the client and server to accomplish anything interesting. Most
people fumble around starting the server, then the client. 
<br /><br />
Did you know that you can tell VS to run both at once. You just have to know where
to look. The place to look is the <b>properties of the solution</b>. i.e. Right-click
on the solution and choose properties and you'll get this dialog:<br /><br /><p></p><a target="_blank" href="http://www.michaelckennedy.net/blog/content/binary/Solution%20WcfApplication%20Property%20Pages.png"><img src="http://www.michaelckennedy.net/blog/content/binary/Solution%20WcfApplication%20Property%20Pages%20%28thumb%29.png" border="0" /></a><br />
                                   <a target="_blank" href="http://www.michaelckennedy.net/blog/content/binary/Solution%20WcfApplication%20Property%20Pages.png">Click
for full image</a><br /><br />
By default this is set to "Single startup project". But you just have to select "Multiple
startup projects" and you're on your way to smooth sailing with your client / server
application. You even get debugging of both the client and server when you press F5.<br /><br />
Enjoy!<br /><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=bfb08f1b-c7b8-4c13-b0a3-f9cfdb4508b9" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Visual Studio Tricks Series: #1 Set As Startup Project</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,ef718e55-62fb-404a-b685-0136306a0afe.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,ef718e55-62fb-404a-b685-0136306a0afe.aspx</id>
    <published>2007-07-30T12:42:55.218-07:00</published>
    <updated>2007-07-30T12:42:55.218625-07:00</updated>
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p class="MsoNormal">
Welcome to my Visual Studio Tricks series. Here I’ll give you some quick tips for
saving you lots of time when working with Visual Studio. 
<br /></p>
        <p class="MsoNormal">
In this first installment, I'll show you how to switch between projects more quickly.
Any time you work on a large project, you’ll have several projects that you might
want to launch from within a solution. This includes at least an EXE and a unit test
project right? Hint, hint, nudge, nudge. 
</p>
        <p class="MsoNormal">
Typically you do this by right-clicking on the project and say “Set as Startup Project”.
But did you know you can set a hot key for this? Just go to the keyboard options in
VS 2005 and type “SetAsStar” and you’ll see this screen:<br /><br /></p>
        <p class="MsoNormal">
          <img src="http://www.michaelckennedy.net/blog/content/binary/SetAsStartup.png" border="0" />
        </p>
        <p>
          <br />
        </p>
        <p>
If you select the startup project option, you can now add a keyboard shortcut. Sounds
simple but it saves lots of time and fumbling with the mouse. There are no hotkeys
assigned by default. Note that I chose &lt;ctrl&gt;-&lt;shift&gt;+P. That seems like
a good choice for me. 
<br /></p>
        <p>
          <br />
        </p>
        <img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=ef718e55-62fb-404a-b685-0136306a0afe" />
        <br />
        <hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Agile Object Oriented Design Talk at Central Jersey Group Tonight</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,afd6e11e-5a81-4fb4-9d8b-eeab2f67c72b.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,afd6e11e-5a81-4fb4-9d8b-eeab2f67c72b.aspx</id>
    <published>2006-10-19T06:42:00.062-07:00</published>
    <updated>2006-11-09T06:59:57.094-08:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'll be speaking tonight at The Central New Jersey .NET User Group (<a href="http://www.njdotnet.net/">http://www.njdotnet.net</a>)
on one of my favorite topics: <i>Five Fundamental Object Oriented Design Principles
for Agile Development.</i></p>
        <p>
Thanks to Jason Beres (<a href="http://www.geekswithblogs.net/jberes">http://www.geekswithblogs.net/jberes</a>)
for inviting me to speak at his user group and welcoming me to New Jersey.
</p>
        <p>
Once you've attended the talk, you might be interested in downloading the slides and
sample code:
</p>
        <p>
    <a href="http://www.MichaelCKennedy.net/Talks/Downloads/NJdotNet/AgileDesign.zip">http://www.MichaelCKennedy.net/Talks/Downloads/NJdotNet/AgileDesign.zip</a></p>
        <p>
You also might want to look into some of the tools I was using in Visual Studio. See <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,1055258d-1557-43d1-a896-e1387a809639.aspx">an
older post on my tricked out Visual Studio</a>.
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=afd6e11e-5a81-4fb4-9d8b-eeab2f67c72b" />
        <br />
        <hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Great Meeting at OCVBUG and OC C# Last Night</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,1055258d-1557-43d1-a896-e1387a809639.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,1055258d-1557-43d1-a896-e1387a809639.aspx</id>
    <published>2006-05-10T17:31:51.718-07:00</published>
    <updated>2006-05-10T17:35:47.186875-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Thanks to Reza Madani and Mike Vincent for
having me speak at the combined meeting of <a href="http://www.ocvbug.org/">OC VBUG</a> and <a href="http://www.occsharp.org/">OC
C#</a> last night. It was a packed house which was wonderful, but I felt bad for folks
who had to stand in the back for 2 hours.<br /><br />
The audience participation was great. Thanks to everyone who asked questions or had
comments.<br /><br />
You can download the slides and samples from my website here:<br /><br /><a href="http://www.michaelckennedy.net/Talks/Downloads/OCVBandCSharp/AgileDesign.zip">http://www.michaelckennedy.net/Talks/Downloads/OCVBandCSharp/AgileDesign.zip</a><br /><br />
Many attendees also noticed the tricked-out Visual Studio I was using during the presentation.
That was from CodeRush and Refactor! both highly recommended. You can check those
out here:<br /><br /><a href="http://www.devexpress.com/Products/NET/CodeRush/">http://www.devexpress.com/Products/NET/CodeRush/</a><br /><a href="http://www.devexpress.com/Products/NET/Refactor/">http://www.devexpress.com/Products/NET/Refactor/</a><br /><br />
and DevExpress has some very interesting screen-casts demos here:<br /><br /><a href="http://www.devexpress.com/Products/NET/CodeRush/Training.xml">http://www.devexpress.com/Products/NET/CodeRush/Training.xml</a><br /><br />
Also I was using the new Vista programming font Consolas, which you can download here:<br /><br /><a href="http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;displaylang=en">Consolas
Font Pack for Microsoft Visual Studio 2005</a><br /><br /><br /><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=1055258d-1557-43d1-a896-e1387a809639" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>OOD at San Diego .NET Developers Group</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,a6ffd1f3-90bb-4c38-bd73-a35bfba6987a.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,a6ffd1f3-90bb-4c38-bd73-a35bfba6987a.aspx</id>
    <published>2006-05-02T17:28:23.999-07:00</published>
    <updated>2006-05-10T17:36:07.499375-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Thanks to David McCater for hosting my Agile
Object Oriented Design talk at <a href="http://sddotnetdg.org/">San Diego .NET Developers
Group</a> on May 2nd. I met some great guys and thoroughly enjoyed talking about agile
and OOD topics with everyone.<br /><br />
You can download the slides at:<br /><br /><a href="http://www.michaelckennedy.net/talks/downloads/sddotnetdev/agiledesign.zip"> http://www.michaelckennedy.net/talks/downloads/sddotnetdev/agiledesign.zip</a><p></p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=a6ffd1f3-90bb-4c38-bd73-a35bfba6987a" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Back to Basics: Agile Object-Oriented Design</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,535e6e2a-f9f9-4ab3-9b4c-666806c317d5.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,535e6e2a-f9f9-4ab3-9b4c-666806c317d5.aspx</id>
    <published>2006-04-10T08:06:40.816-07:00</published>
    <updated>2006-04-11T08:08:20.8760594-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dave, over at <a href="http://extremeplanner.com/">extremeplanner.com</a>, wrote a <a href="http://www.extremeplanner.com/blog/2006/03/back-to-basics-agile-object-oriented.html">nice
summary</a> of the talk I gave <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,e2ac89c1-41c1-4230-ade1-da6a806173e3.aspx">at
XPSD</a>. I completely agree with him that "a review of these fundamentals [is] refreshing."
As you can see, I'm doing my part to spread the word: 
</p>
        <ul>
          <li>
            <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,e38d0266-3bbb-4d86-ad2b-1a68791694ed.aspx">Upcoming
Talk in Orange County</a>
          </li>
          <li>
            <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,44d3d0c7-9dbb-4082-86d9-332676339c3c.aspx">Upcoming
Talk in San Diego (Tentative)<br /></a>
          </li>
          <li>
            <a href="http://www.socalcodecamp.com/">The Rock &amp; Roll Code Camp</a> (details
upcoming)<br /><br /></li>
          <li>
            <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,e2ac89c1-41c1-4230-ade1-da6a806173e3.aspx">XPSD
Object Oriented Design Talk</a> (past presentation)</li>
          <li>
            <a href="http://www.michaelckennedy.net/blog/PermaLink,guid,5a683464-410a-41ca-a3c1-2cc7fc9df3d4.aspx">January
SoCal Code Camp Talk</a> (past presentation)</li>
        </ul>
Many pundits and authors in the software industry are busy promoting the next big
product/feature/etc that they seem to forget that these things only provide second
order benefits as compared to the more "fundamental" ideas such as good object oriented
design. For example, looking through some of the user groups' upcoming meetings you'll
find topics like: 
<ul><li>
Looking at some Cool New Features of ASP.NET 2.0: Managing Membership and Role Management</li><li>
Leveraging the New Windows Mobile APIs</li><li>
Visual Studio Team System</li><li>
Closer to the Data: Using Managed Code in the Database with SQL Server 2005</li></ul><p>
Lots of neat, whiz-bang features, but I would contend that 90% of the audience would
be <strong>much</strong> better off if they had heard a good talk about solid OOD
or TDD or this list goes on. It's been my experience that much of these old (5-15
years), tried and true fundamentals are unfamiliar to most developers. 
</p><p>
So here is my call to action: 
</p><p>
If you are a speaker or author, reach for something big for your next topic. Yes it's
easier to write/talk about the details of the next version of feature X. But
you'll do your audience a service if you reach higher, think bigger, and go for something
"fundamental." 
</p><p>
If you are attending user groups and code camps, ask for and expect something more
than a talk on the of latest version of product X.
</p><img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=535e6e2a-f9f9-4ab3-9b4c-666806c317d5" /><br /><hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Upcoming Talk in San Diego (Tentative)</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,44d3d0c7-9dbb-4082-86d9-332676339c3c.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,44d3d0c7-9dbb-4082-86d9-332676339c3c.aspx</id>
    <published>2006-04-05T11:39:00.327-07:00</published>
    <updated>2006-04-11T08:09:18.6714548-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am tenatively scheduled to speak in San Diego, CA at the “San Diego .NET Developers
Group” (<a href="http://sddotnetdg.org/">http://sddotnetdg.org/</a>). We haven’t arranged
a date yet, but I think it will be around late spring / early summer.
</p>
        <p>
This time I will again be presenting a talk on object oriented design and agile development,
probably a slight variation on the general topics from my other talks.
</p>
        <p>
I’ll provide more details as they become available.
</p>
        <img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=44d3d0c7-9dbb-4082-86d9-332676339c3c" />
        <br />
        <hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Books for Agile and Object Oriented Design</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,d312f56f-4bf9-466d-a463-875175ba7eb3.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,d312f56f-4bf9-466d-a463-875175ba7eb3.aspx</id>
    <published>2006-04-04T17:33:21.416-07:00</published>
    <updated>2006-04-04T23:40:32.729-07:00</updated>
    <category term="Books" label="Books" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Books.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
You often hear it stated by very bright people that they thought they understood
object oriented design until they began practicing Test Driven Development (TDD).
I definitely include myself in that group (the misunderstanding OOD part anyway!).
</p>
        <p>
Here is a list of the very best books I have found that helps bridge the divide between
OOD and Agile for those of you who are currently making that transition. They are
highly recommended.
</p>
        <p>
          <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;tag=michackennesw-20&amp;camp=1789&amp;creative=9325&amp;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0135974445%2Fsr%3D8-1%2Fqid%3D1144195976%2Fref%3Dpd_bbs_1%3F%255Fencoding%3DUTF8">Agile
Software Development, Principles, Patterns, and Practices</a>
          <img style="border: medium none ; margin: 0px;" alt="" src="http://www.assoc-amazon.com/e/ir?t=michackennesw-20&amp;l=ur2&amp;o=1" border="0" height="1" width="1" />
          <br />
by Robert C. Martin
</p>
        <p>
          <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;tag=michackennesw-20&amp;camp=1789&amp;creative=9325&amp;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0201485672%2Fsr%3D8-1%2Fqid%3D1144196485%2Fref%3Dpd_bbs_1%3F%255Fencoding%3DUTF8">Refactoring:
Improving the Design of Existing Code</a>
          <img style="border: medium none ; margin: 0px;" alt="" src="http://www.assoc-amazon.com/e/ir?t=michackennesw-20&amp;l=ur2&amp;o=1" border="0" height="1" width="1" />
          <br />
by Martin Fowler 
</p>
        <p>
          <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;tag=michackennesw-20&amp;camp=1789&amp;creative=9325&amp;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0131177052%2Fsr%3D8-1%2Fqid%3D1144196575%2Fref%3Dpd_bbs_1%3F%255Fencoding%3DUTF8">Working
Effectively with Legacy Code</a>
          <img style="border: medium none ; margin: 0px;" alt="" src="http://www.assoc-amazon.com/e/ir?t=michackennesw-20&amp;l=ur2&amp;o=1" border="0" height="1" width="1" />
          <br />
by Michael Feathers
</p>
        <img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=d312f56f-4bf9-466d-a463-875175ba7eb3" />
        <br />
        <hr />
All content copyright Michael C. Kennedy. All information, source code, and especially
tools are provided as is and on a "use age your own risk" basis.
</div>
    </content>
  </entry>
  <entry>
    <title>Upcoming Talk in Orange County</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,e38d0266-3bbb-4d86-ad2b-1a68791694ed.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,e38d0266-3bbb-4d86-ad2b-1a68791694ed.aspx</id>
    <published>2006-04-02T23:02:33-07:00</published>
    <updated>2006-04-04T17:08:35.76025-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="html">&lt;p&gt;
I&amp;rsquo;m very pleased to announce that I&amp;rsquo;ll be speaking in Orange County, CA
on May 9th from 6pm onward.
&lt;/p&gt;
&lt;p&gt;
I&amp;rsquo;ll will be presenting a talk on object oriented design and agile development
at a joint meeting of the &amp;ldquo;Orange Country C# Developers Group&amp;rdquo; (&lt;a href="http://sddotnetdg.org/"&gt;http://sddotnetdg.org/&lt;/a&gt;)&amp;nbsp;and
the &amp;ldquo;Orange County VB.NET User Group&amp;rdquo; (&lt;a href="http://www.ocvbug.org/"&gt;http://www.ocvbug.org/&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
I encourage anyone in the Anaheim / L.A. area interested in the interplay between
object oriented design and agile software development to attend.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=e38d0266-3bbb-4d86-ad2b-1a68791694ed" /&gt;
&lt;br /&gt;
&lt;hr /&gt;All content copyright Michael C. Kennedy. All information, source code, and especially tools are provided as is and on a "use age your own risk" basis.</content>
  </entry>
  <entry>
    <title>XPSD Object Oriented Design Talk</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,e2ac89c1-41c1-4230-ade1-da6a806173e3.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,e2ac89c1-41c1-4230-ade1-da6a806173e3.aspx</id>
    <published>2006-04-01T22:45:57-07:00</published>
    <updated>2006-04-05T11:41:40.639875-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="html">&lt;p&gt;
[NOTE: This recent post refers to a much older (March 3, 2006) event.]
&lt;/p&gt;
&lt;p&gt;
I want thank Carlton Nettleton and June Clarke for inviting me to present my &amp;ldquo;&lt;em&gt;Five
Fundamental Object Oriented Design Principles for Agile Development&lt;/em&gt;&amp;rdquo; talk
at &lt;a href="http://xpsd.org/cgi-bin/wiki"&gt;XPSD&lt;/a&gt; this &lt;a href="http://www.xpsd.org/cgi-bin/wiki?PreviousPresentations"&gt;past
March&lt;/a&gt;. The audience participation was great and I really learned a lot myself!
&lt;/p&gt;
&lt;p dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
You can download the slides and code samples here:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.michaelckennedy.net/Talks/Downloads/XPSD/AgileDesign.zip"&gt;http://michaelckennedy.net/Talks/Downloads/XPSD/AgileDesign.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=e2ac89c1-41c1-4230-ade1-da6a806173e3" /&gt;
&lt;br /&gt;
&lt;hr /&gt;All content copyright Michael C. Kennedy. All information, source code, and especially tools are provided as is and on a "use age your own risk" basis.</content>
  </entry>
  <entry>
    <title>January SoCal Code Camp Talk</title>
    <link rel="alternate" type="text/html" href="http://www.michaelckennedy.net/blog/PermaLink,guid,5a683464-410a-41ca-a3c1-2cc7fc9df3d4.aspx" />
    <id>http://www.michaelckennedy.net/blog/PermaLink,guid,5a683464-410a-41ca-a3c1-2cc7fc9df3d4.aspx</id>
    <published>2006-04-01T22:40:58-07:00</published>
    <updated>2006-04-01T22:40:58-07:00</updated>
    <category term="Talks" label="Talks" scheme="http://www.michaelckennedy.net/blog/CategoryView,category,Talks.aspx" />
    <content type="html">&lt;p&gt;
[NOTE: This recent post refers to a much older (Jan 21, 2006) event.]
&lt;/p&gt;
&lt;p&gt;
I want to thank everyone who attended my talk at the first Southern California Code
Camp. I really enjoyed speaking there and I got the sense that many of you got something
from the talk. In case you weren&amp;rsquo;t there and are interested, here&amp;rsquo;s the
abstract:
&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;Five Fundamental Object Oriented Design Principles for Agile Development&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
This session will present five object oriented design principles that facilitate agile
software development. These general design principles promote the creation of testable,
maintainable, and reusable software. The principles include the Open Closed Principle
and the Liskov Substitution Principle. The interaction between Agile Development and
these principles will be demonstrated using several code samples. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;You can download the slides and code samples here:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.michaelckennedy.net/Talks/Downloads/SoCalCodeCamp/AgileDesign.zip"&gt;http://michaelckennedy.net/Talks/Downloads/SoCalCodeCamp/AgileDesign.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.michaelckennedy.net/blog/aggbug.ashx?id=5a683464-410a-41ca-a3c1-2cc7fc9df3d4" /&gt;
&lt;br /&gt;
&lt;hr /&gt;All content copyright Michael C. Kennedy. All information, source code, and especially tools are provided as is and on a "use age your own risk" basis.</content>
  </entry>
</feed>