<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Javier Arguello (javarg)</title><link>http://weblogs.asp.net/mjarguello/default.aspx</link><description>Sharing my daily work experience..</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>CodedUI: Close Dialogs and Windows</title><link>http://weblogs.asp.net/mjarguello/archive/2012/01/27/codedui-close-dialogs-and-windows.aspx</link><pubDate>Sat, 28 Jan 2012 03:05:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8270376</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=8270376</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2012/01/27/codedui-close-dialogs-and-windows.aspx#comments</comments><description>&lt;p&gt;UI automation could be a very very complex procedure. Several things could change between different executions, controls could be moved or renamed, etc. &lt;/p&gt;  &lt;p&gt;Some simple things such as closing a dialog popup/window could be challenging.. &lt;/p&gt;  &lt;p&gt;Let’s try to recreate the problem. File/New Project in Visual Studio 2010, then select Windows Forms. &lt;/p&gt;  &lt;p&gt;Add a button with the following handler on the click event:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:73707b07-37c4-4ce7-b28f-9d231bd25ef4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;MessageBox&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color:#a31515"&gt;&amp;quot;Try closing me..&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;Try closing me..&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;MessageBoxButtons&lt;/span&gt;.OKCancel);&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Record a &lt;a href="http://msdn.microsoft.com/en-us/library/dd286726.aspx" target="_blank"&gt;CodedUI&lt;/a&gt; test that opens our super simple WinForm App, click Button1 and then close the message box. Finally, add one last step to record that closes the Main Window.&lt;/p&gt;  &lt;p&gt;Now run the previous CodeUI test and check how the test reports a successful execution. Note that your Message Box is still opened and your application is still waiting for input.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;* I imagine that it should be a better way of working around this effect than the following. If you figure it out let me know :).&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Let’s create a &lt;em&gt;UIMapExtensions&lt;/em&gt; class (containing extensions methods of course)&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0aab4f0e-a4d5-46ac-a3a7-ccbbf12cb49f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;UIMapExtensions&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UIMapExtensions&lt;/span&gt;&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;delegate&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CloseTestControlCallback&lt;/span&gt;();&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; CloseWindow(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UITestControl&lt;/span&gt; testControl, &lt;span style="color:#2b91af"&gt;CloseTestControlCallback&lt;/span&gt; closeCallback)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; closeSuccess =&lt;br&gt;             testControl.WaitForControlCondition(&lt;br&gt;                 tc =&amp;gt;&lt;br&gt;                 {&lt;br&gt;                     closeCallback();&lt;br&gt;                     &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; !tc.Exists;&lt;br&gt;                 }, 3000);&lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; closeSuccess;&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; CancelDialog(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UITestControl&lt;/span&gt; testControl)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; closeSuccess =&lt;br&gt;             testControl.WaitForControlCondition(&lt;br&gt;                 tc =&amp;gt;&lt;br&gt;                 {&lt;br&gt;                     &lt;span style="color:#2b91af"&gt;Keyboard&lt;/span&gt;.SendKeys(&lt;span style="color:#a31515"&gt;&amp;quot;{ESC}&amp;quot;&lt;/span&gt;);&lt;br&gt;                     &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; !tc.Exists;&lt;br&gt;                 }, 3000);&lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; closeSuccess;&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; AcceptDialog(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UITestControl&lt;/span&gt; testControl)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; closeSuccess =&lt;br&gt;             testControl.WaitForControlCondition(&lt;br&gt;                 tc =&amp;gt;&lt;br&gt;                 {&lt;br&gt;                     &lt;span style="color:#2b91af"&gt;Keyboard&lt;/span&gt;.SendKeys(&lt;span style="color:#a31515"&gt;&amp;quot;{ENTER}&amp;quot;&lt;/span&gt;);&lt;br&gt;                     &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; !tc.Exists;&lt;br&gt;                 }, 3000);&lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; closeSuccess;&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; CloseWindow(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UITestControl&lt;/span&gt; testControl)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; closeSuccess =&lt;br&gt;             testControl.WaitForControlCondition(&lt;br&gt;                 tc =&amp;gt;&lt;br&gt;                 {&lt;br&gt;                     &lt;span style="color:#2b91af"&gt;WinApi&lt;/span&gt;.PostMessage(tc.WindowHandle, &lt;span style="color:#2b91af"&gt;WinApi&lt;/span&gt;.WM_CLOSE, 0, 0);&lt;br&gt;                     &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; !tc.Exists;&lt;br&gt;                 }, 3000);&lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; closeSuccess;&lt;br&gt;     }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;I am using 3 techniques in the previous code fragment. In each one of them, we wait for the control to respond to the close action (for 3000 ms).&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;CloseWindow &lt;/strong&gt;that receives a delegate to the close action. You can pass in the original Close method generated by the UIMap as you will see in the Test Method code below. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;CloseWindow with no arguments&lt;/strong&gt; using &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644944(v=vs.85).aspx" target="_blank"&gt;PostMessage&lt;/a&gt; Win API and &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc164123.aspx" target="_blank"&gt;P/Invoke&lt;/a&gt; (this is some how brute force :)). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AcceptDialog&lt;/strong&gt; and &lt;strong&gt;CancelDialog&lt;/strong&gt;: assuming it is a message box with Ok/Cancel buttons and that the window is in the foreground. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Now you can just replace some of generated test code in the Test Class (not in the UIMap):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f0ce652f-19d7-4b32-84b0-033ce6381b2d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Test Method&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;[&lt;span style="color:#2b91af"&gt;TestMethod&lt;/span&gt;]&lt;br&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; CodedUITestMethod1()&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.UIMap.OpenApplication();&lt;br&gt;     &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.UIMap.OpenPopup();&lt;br&gt;     &lt;span style="color:#008000"&gt;//this.UIMap.ClosePopup();&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="color:#008000"&gt;// try one of the following..&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; closeSuccess = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.UIMap.UItryclosingmeWindow.CloseWindow(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.UIMap.ClosePopup);&lt;br&gt;     &lt;span style="color:#008000"&gt;//var closeSuccess = this.UIMap.UItryclosingmeWindow.AcceptDialog();&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#008000"&gt;//var closeSuccess = this.UIMap.UItryclosingmeWindow.CancelDialog();&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#008000"&gt;//var closeSuccess = this.UIMap.UItryclosingmeWindow.CloseWindow();&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!closeSuccess)&lt;br&gt;         &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.Fail(&lt;span style="color:#a31515"&gt;&amp;quot;Popup not closed!&amp;quot;&lt;/span&gt;);&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.UIMap.CloseApplication();&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;My two cents..&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8270376" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/ALM/default.aspx">ALM</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Testing/default.aspx">Testing</category></item><item><title>TFS Build 2010: BuildNumber and DropLocation</title><link>http://weblogs.asp.net/mjarguello/archive/2011/11/17/tfs-build-2010-buildnumber-and-droplocation.aspx</link><pubDate>Fri, 18 Nov 2011 00:38:38 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8062366</guid><dc:creator>javarg</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=8062366</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/11/17/tfs-build-2010-buildnumber-and-droplocation.aspx#comments</comments><description>&lt;p&gt;Automatic Builds for Application Release is a current practice in every major development factory nowadays.&lt;/p&gt;  &lt;p&gt;Using Team Foundation Server Build 2010 to accomplish this offers many opportunities to improve quality of your releases.&lt;/p&gt;  &lt;p&gt;The following approach allow us to generate build drop folders including the BuildNumber and the Changeset or Label provided. Using this procedure we can quickly identify the generated binaries in the Drop Server with the corresponding Version.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Branch the &lt;strong&gt;DefaultTemplate.xaml&lt;/strong&gt; and renamed it with &lt;strong&gt;CustomDefaultTemplate.xaml&lt;/strong&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_0F720915.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_6E7E966D.png" width="244" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open it for edit (check out) &lt;/li&gt;    &lt;li&gt;Go to the &lt;strong&gt;Set Drop Location&lt;/strong&gt; Activity and edit the &lt;strong&gt;DropLocation&lt;/strong&gt; property. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_33B6ED97.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_5868050E.png" width="658" height="266" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Write the following expression: &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;BuildDetail.DropLocationRoot&lt;/strong&gt; + &amp;quot;\&amp;quot; + &lt;strong&gt;BuildDetail.BuildDefinition.Name&lt;/strong&gt; + &amp;quot;\&amp;quot; + &lt;strong&gt;If&lt;/strong&gt;(String.IsNullOrWhiteSpace(&lt;strong&gt;GetVersion&lt;/strong&gt;), &lt;strong&gt;BuildDetail.SourceGetVersion&lt;/strong&gt;, &lt;strong&gt;GetVersion&lt;/strong&gt;) + &amp;quot;_&amp;quot; + &lt;strong&gt;BuildDetail.BuildNumber&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Check in the branched template. &lt;/li&gt;    &lt;li&gt;Now create a build definition named &lt;strong&gt;TestBuildForDev&lt;/strong&gt; using the new template. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The previous expression sets the DropLocation with the following format: &lt;strong&gt;(ChangesetNumber|LabelName)_BuildName_BuildNumber&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first part of the folder name will be the changeset number or the label name (if triggered using labels). Folder names will be generated as following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;C1850_TestBuildForDev_20111117.1 (changesets start with letter C) &lt;/li&gt;    &lt;li&gt;LLabelname_TestBuildForDev_20111117.1 (labels start with letter L) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Try launching a build from a Changeset and from a Label. You can specify a Label in the &lt;strong&gt;GetVersion&lt;/strong&gt; parameter in the &lt;strong&gt;Queue new Build Wizard, &lt;/strong&gt;going to the &lt;strong&gt;Parameters&lt;/strong&gt; tab (for labels add the “L” prefix):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_347F2DB4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_248FE8F0.png" width="344" height="393" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8062366" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/TFS/default.aspx">TFS</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Build/default.aspx">Build</category></item><item><title>Evento Gratuito de Arquitectura / Architecture Event</title><link>http://weblogs.asp.net/mjarguello/archive/2011/11/17/evento-gratuito-de-arquitectura-architecture-event.aspx</link><pubDate>Thu, 17 Nov 2011 23:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8062313</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=8062313</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/11/17/evento-gratuito-de-arquitectura-architecture-event.aspx#comments</comments><description>&lt;p&gt;El próximo 29 de noviembre voy a participar como orador en Microsoft en este evento gratuito sobre Herramientas de desarrollo y patrones de Arquitectura. Vamos a tomar varios temas interesantes sobre Arquitectura y construcción de Frameworks de Desarrollo.&lt;/p&gt;  &lt;p&gt;Si están interesados en asistir, se pueden comunicar conmigo a través de un comentario en este blog o registrarse &lt;a title="Registro" href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032499648&amp;amp;culture=en-us" target="_blank" mce_href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032499648&amp;amp;culture=en-us"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;English&lt;/strong&gt;: Next November 29th I will be participating as a speaker in a free admission event at Microsoft México offices. We will be discussing very interesting topics about Architecture and the development of Technical Frameworks.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_4F0C1997.png" mce_href="http://weblogs.asp.net/blogs/mjarguello/image_4F0C1997.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_4A55C343.png" width="395" height="353" mce_src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_4A55C343.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8062313" width="1" height="1"&gt;</description></item><item><title>Load Test in Windows Azure with Visual Studio Test Agents</title><link>http://weblogs.asp.net/mjarguello/archive/2011/05/22/load-test-in-windows-azure-with-visual-studio-test-agents.aspx</link><pubDate>Mon, 23 May 2011 01:12:04 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7800308</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7800308</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/05/22/load-test-in-windows-azure-with-visual-studio-test-agents.aspx#comments</comments><description>&lt;p&gt;Tomorrow I will be presenting “&lt;em&gt;Load Test in Windows Azure with Visual Studio Test Agents&lt;/em&gt;” on MSDN. Hope to see you there.&lt;/p&gt;  &lt;p&gt;Register &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032480734&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7800308" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/ALM/default.aspx">ALM</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Azure/default.aspx">Azure</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Testing/default.aspx">Testing</category></item><item><title>Using Moles with DLR (dynamic)</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/26/using-moles-with-dlr.aspx</link><pubDate>Tue, 26 Apr 2011 19:13:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7771038</guid><dc:creator>javarg</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7771038</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/26/using-moles-with-dlr.aspx#comments</comments><description>&lt;p&gt;As several people have found, Moles does not work well with DLR. Check &lt;a href="http://www.cameronfletcher.com/post/InvalidOperationException-Dynamic-operations-can-only-be-performed-in-homogenous-AppDomain.aspx" target="_blank" mce_href="http://www.cameronfletcher.com/post/InvalidOperationException-Dynamic-operations-can-only-be-performed-in-homogenous-AppDomain.aspx"&gt;Cameron’s post&lt;/a&gt; for this issue.&lt;/p&gt;  &lt;p&gt;In order to make it work do the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Go to folder C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\ &lt;/li&gt;    &lt;li&gt;Backup files Microsoft.Moles.VsHost.exe.Config / Microsoft.Moles.VsHost.x86.exe.Config (depending on your application’s platform) &lt;/li&gt;    &lt;li&gt;Modify the &lt;strong&gt;starup&lt;/strong&gt; element and set the &lt;strong&gt;useLegacyV2RuntimeActivationPolicy&lt;/strong&gt; to false in the .config file. &lt;/li&gt;    &lt;li&gt;Modify the &lt;strong&gt;legacyCasPolicy&lt;/strong&gt; element and set the &lt;strong&gt;enabled&lt;/strong&gt; to false the .config file. &lt;/li&gt; &lt;/ol&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1155eb8e-1afd-4b92-b648-6f54c466b355" class="wlWriterEditableSmartContent"&gt; &lt;div style='border: 1px solid rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: "Courier New", Courier, Monospace; font-size: 10pt;'&gt; &lt;div style="background: rgb(0, 0, 128); padding: 2px 5px; color: rgb(255, 255, 255); font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold;"&gt;Microsoft.Moles.VsHost.x86.exe&lt;/div&gt; &lt;div style="padding: 2px 5px; overflow: auto; white-space: nowrap; max-height: 300px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;xml&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;1.0&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;encoding&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;utf-8&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt; ?&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;startup&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;useLegacyV2RuntimeActivationPolicy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;supportedRuntime&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;v4.0&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt; /&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;supportedRuntime&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;v2.0.50727&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt; /&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;startup&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;runtime&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;legacyCasPolicy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;enabled&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;"&lt;span style="color: rgb(0, 0, 255);"&gt; /&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;runtime&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I haven’t done further testing on changing the use of legacy CAS Policy when using Moles &amp;amp; VS Test Framework. &lt;/p&gt;  &lt;p&gt;Let me know how it works for you.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7771038" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Unit+Test/default.aspx">Unit Test</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Testing/default.aspx">Testing</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Moles/default.aspx">Moles</category></item><item><title>Moles and Linq to SQL: Mocking Linq to SQL Behavior</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/26/moles-and-linq-to-sql-mocking-linq-to-sql-behavior.aspx</link><pubDate>Tue, 26 Apr 2011 15:21:38 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7770903</guid><dc:creator>javarg</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7770903</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/26/moles-and-linq-to-sql-mocking-linq-to-sql-behavior.aspx#comments</comments><description>&lt;p&gt;In recent years there’s been major investments in developing tools in order to provide good quality assurance features and incorporate industry practices into them.&lt;/p&gt;  &lt;p&gt;TDD, DDD, Unit Testing, Continuous Integration, etc.&lt;/p&gt;  &lt;p&gt;Microsoft has recently (not so recently actually :)) ship some very nice features to help us improve our code quality by allowing us to create better tests over units of code. &lt;/p&gt;  &lt;p&gt;Unit testing is all about proving individual units of code (positive and negative testing). Since a great deal of software is not always designed with this “unit independence” in mind, it can be a challenge to isolate dependencies for every piece of source code (specially legacy code).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://research.microsoft.com/en-us/projects/pex/" target="_blank"&gt;Moles&lt;/a&gt; is an Isolation Framework that mocks/emulates the behavior of our components and external libraries, even for private members. You could even mock how a particular System.* class object in .NET behaves (check Pex &amp;amp; Moles &lt;a href="http://research.microsoft.com/en-us/projects/pex/" target="_blank"&gt;site&lt;/a&gt; in Microsoft Research).&lt;/p&gt;  &lt;p&gt;The following is a Repository object that uses &lt;a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx" target="_blank"&gt;Linq to Sql&lt;/a&gt; Data Context internally and doesn't provide a simple way of decoupling database access from its behavior. It means we cannot unit test the following class without a SQL database.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9076f5e2-cae8-4f36-8df2-e1b3ba067e47" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Customer Repository&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CustomerRepository&lt;/span&gt;&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;&amp;gt; GetCustomers()&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; db = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AdventureWorksDataContext&lt;/span&gt;())&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; db.Customers.ToList();&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt; GetCustomer(&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; id)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; db = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AdventureWorksDataContext&lt;/span&gt;())&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; db.Customers.FirstOrDefault(c =&amp;gt; c.CustomerID == id);&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;By using Moles, we could replace inner behavior of this class.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is White Box Testing, meaning you need to have access to internal implementation in order to know how to mock it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mocking with Moles&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Download and install Moles. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add Mole Assemblies for the project hosting the previous class (or the code you wish to test)&lt;/li&gt;    &lt;li&gt;Add Mole Assembly for System.Data.Linq&lt;/li&gt;    &lt;li&gt;Add Mole Assembly for System.Core&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Check &lt;a href="http://research.microsoft.com/en-us/projects/pex/molestutorial.docx" target="_blank"&gt;this tutorial&lt;/a&gt; about Pex &amp;amp; Moles for more information about the previous steps.&lt;/p&gt;  &lt;p&gt;The following code fragment unit test our GetCustomers method:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:729cdc51-84da-4b0e-847c-af3d843cae3b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Overriding Enumeration&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;[&lt;span style="color:#2b91af"&gt;TestMethod&lt;/span&gt;()]&lt;br&gt; [&lt;span style="color:#2b91af"&gt;HostType&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Moles&amp;quot;&lt;/span&gt;)]&lt;br&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; GetCustomersTest()&lt;br&gt; {&lt;br&gt;     System.Data.Linq.Moles.&lt;span style="color:#2b91af"&gt;MTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;&amp;gt;.&lt;span style="color:#2b91af"&gt;AllInstances&lt;/span&gt;.GetEnumerator =&lt;br&gt;         tc =&amp;gt;&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; mockCustomers = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;&amp;gt;() &lt;br&gt;             {&lt;br&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;() { FirstName = &lt;span style="color:#a31515"&gt;&amp;quot;Javier&amp;quot;&lt;/span&gt; },&lt;br&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;() { FirstName = &lt;span style="color:#a31515"&gt;&amp;quot;Jorge&amp;quot;&lt;/span&gt; },&lt;br&gt;                 &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;() { FirstName = &lt;span style="color:#a31515"&gt;&amp;quot;Dario&amp;quot;&lt;/span&gt; } &lt;br&gt;             };&lt;br&gt; &lt;br&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; mockCustomers.GetEnumerator();&lt;br&gt;         };&lt;br&gt; &lt;br&gt;     &lt;span style="color:#2b91af"&gt;CustomerRepository&lt;/span&gt; target = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CustomerRepository&lt;/span&gt;();&lt;br&gt;     &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; customers = target.GetCustomers();&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(customers);&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.IsTrue(customers.Count == 3);&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color:#a31515"&gt;&amp;quot;Javier&amp;quot;&lt;/span&gt;, customers[0].FirstName);&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Check out the use of Moles to specify the behavior of enumeration for the Table&amp;lt;Customer&amp;gt; (Customers) that Linq to Sql Provider uses to execute the query in the database. In the previous code, we avoid querying data from database and return an in-memory list of customers.       &lt;p&gt;When executing a lambda expression using Linq to Sql, the source Linq provider must interpret the query and then issue a command to the database.&lt;/p&gt;    &lt;p&gt;In order to intercept the query and return mock results, we must override default behavior for the expression evaluation logic of the Linq Provider.&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f6c7fbea-71cc-4441-8fe8-240c9509c5ac" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Overriding Expression Eval&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;[&lt;span style="color:#2b91af"&gt;TestMethod&lt;/span&gt;()]&lt;br&gt; [&lt;span style="color:#2b91af"&gt;HostType&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Moles&amp;quot;&lt;/span&gt;)]&lt;br&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; GetCustomerTest()&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; expectedCustomer = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;() { FirstName = &lt;span style="color:#a31515"&gt;&amp;quot;Javier&amp;quot;&lt;/span&gt;, CustomerID = 1 };&lt;br&gt; &lt;br&gt;     System.Data.Linq.Moles.&lt;span style="color:#2b91af"&gt;MTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Customer&lt;/span&gt;&amp;gt;.&lt;span style="color:#2b91af"&gt;AllInstances&lt;/span&gt;.ProviderSystemLinqIQueryableget =&lt;br&gt;         tc =&amp;gt;&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; qp = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; System.Linq.Moles.&lt;span style="color:#2b91af"&gt;SIQueryProvider&lt;/span&gt;();&lt;br&gt;             qp.ExecuteExpression01(exp =&amp;gt; expectedCustomer);&lt;br&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; qp;&lt;br&gt;         };&lt;br&gt; &lt;br&gt;     &lt;span style="color:#2b91af"&gt;CustomerRepository&lt;/span&gt; target = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CustomerRepository&lt;/span&gt;();&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; actualCustomer = target.GetCustomer(expectedCustomer.CustomerID);&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(actualCustomer);&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.AreEqual(expectedCustomer.CustomerID, actualCustomer.CustomerID);&lt;br&gt;     &lt;span style="color:#2b91af"&gt;Assert&lt;/span&gt;.AreEqual(expectedCustomer.FirstName, actualCustomer.FirstName);&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/p&gt;      &lt;p&gt;The previous mocking code returns a Mock QueryProvider that does not evaluate the expression, it simply returns the in-memory customer reference.&lt;/p&gt;  &lt;p&gt;I encourage you that read more about Moles &lt;a href="http://research.microsoft.com/en-us/projects/pex/documentation.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: This cool framework intercepts any managed operation by creating a CLR Host for the application. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7770903" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Unit+Test/default.aspx">Unit Test</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Testing/default.aspx">Testing</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Moles/default.aspx">Moles</category></item><item><title>Visual Studio 2010 crashes with “Exception has been thrown by the target of an invocation”</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/25/visual-studio-2010-crashes-with-exception-has-been-thrown-by-the-target-of-an-invocation.aspx</link><pubDate>Mon, 25 Apr 2011 13:51:13 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7770072</guid><dc:creator>javarg</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7770072</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/25/visual-studio-2010-crashes-with-exception-has-been-thrown-by-the-target-of-an-invocation.aspx#comments</comments><description>&lt;p&gt;If you haven´t installed &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5" target="_blank"&gt;Visual Studio 2010 SP1&lt;/a&gt; yet and you’ve enabled automatic Windows Update, chances are you end up getting the following error when starting VS2010: Exception has been thrown by the target of an invocation.&lt;/p&gt;  &lt;p&gt;There is a .NET 4 Framework in Windows update distributed recently that generates this conflict.&lt;/p&gt;  &lt;p&gt;Solution: Install &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5" target="_blank"&gt;VS2010 Sp1&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7770072" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Webcast MSDN: Parallel LINQ</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/24/webcast-msdn-parallel-linq.aspx</link><pubDate>Mon, 25 Apr 2011 03:49:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7769852</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7769852</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/24/webcast-msdn-parallel-linq.aspx#comments</comments><description>&lt;p&gt;Next Wednesday (April 27th) I will presenting Parallel LINQ and showing some not trivial stuff to optimize performance in parallel algorithms. Register &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032482589&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" target="_blank" mce_href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032482589&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7769852" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/PLINQ/default.aspx">PLINQ</category></item><item><title>.NET Community Mexico City</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/24/net-community-mexico-city.aspx</link><pubDate>Mon, 25 Apr 2011 03:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7769848</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7769848</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/24/net-community-mexico-city.aspx#comments</comments><description>&lt;p&gt;I will be participating as an invited speaker in “Comunidad.NET” in Mexico City next Tuesday (April 26th). My presentation will be focusing code quality using Visual Studio Tools.&lt;/p&gt;&lt;p&gt;Agenda: &amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Code Metrics&lt;/li&gt;&lt;li&gt;Code Analysis&lt;/li&gt;&lt;li&gt;Profiling&lt;/li&gt;&lt;li&gt;IntelliTrace&lt;/li&gt;&lt;li&gt;Pex &amp;amp; Moles&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You can get more info from &lt;a href="http://www.superneurona.com/blogs/" target="_blank" mce_href="http://www.superneurona.com/blogs/"&gt;Raul’s blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7769848" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/ALM/default.aspx">ALM</category></item><item><title>Async C# 5: Using Async Pattern with WCF and Silverlight</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/12/async-c-5-using-async-pattern-with-wcf-and-silverlight.aspx</link><pubDate>Wed, 13 Apr 2011 02:30:19 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7754489</guid><dc:creator>javarg</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7754489</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/12/async-c-5-using-async-pattern-with-wcf-and-silverlight.aspx#comments</comments><description>&lt;p&gt;Sometime ago I published a way to use &lt;a href="http://weblogs.asp.net/mjarguello/archive/2011/03/13/async-ctp-c-5-how-to-make-wcf-work-with-async-ctp.aspx" target="_blank"&gt;WCF service with the new Async Pattern&lt;/a&gt; in C#. The problem is that this approach won’t work with Silverlight. More specifically, &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskfactory.aspx" target="_blank"&gt;TaskFactory&lt;/a&gt; is not available in Silverlight.&lt;/p&gt;  &lt;p&gt;So.. here is one solution (it does not provide full functionality as in TaskFactory, but you can manage 90% of use cases):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8643be9f-a9e0-443c-ae3c-1226842e5d2b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;MyTaskFactory&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MyTaskFactory&lt;/span&gt;&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;&amp;lt;TResult&amp;gt; FromAsync&amp;lt;TResult&amp;gt;(&lt;br&gt;         &lt;span style="color:#2b91af"&gt;IAsyncResult&lt;/span&gt; asyncResult, &lt;span style="color:#2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;IAsyncResult&lt;/span&gt;, TResult&amp;gt; endMethod)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; completionSource = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TaskCompletionSource&lt;/span&gt;&amp;lt;TResult&amp;gt;();&lt;br&gt;         &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (asyncResult.IsCompleted)&lt;br&gt;         {&lt;br&gt;             completionSource.TrySetResult(asyncResult, endMethod);&lt;br&gt;         }&lt;br&gt;         &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;         {&lt;br&gt;             System.Threading.&lt;span style="color:#2b91af"&gt;ThreadPool&lt;/span&gt;.RegisterWaitForSingleObject(&lt;br&gt;                 asyncResult.AsyncWaitHandle,&lt;br&gt;                 (state, timeOut) =&amp;gt;&lt;br&gt;                 {&lt;br&gt;                     completionSource.TrySetResult(asyncResult, endMethod);&lt;br&gt;                 }, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, -1, &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;);&lt;br&gt;         }&lt;br&gt; &lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; completionSource.Task;&lt;br&gt;     }&lt;br&gt; &lt;br&gt;     &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; TrySetResult&amp;lt;TResult&amp;gt;(&lt;br&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TaskCompletionSource&lt;/span&gt;&amp;lt;TResult&amp;gt; completionSource,&lt;br&gt;         &lt;span style="color:#2b91af"&gt;IAsyncResult&lt;/span&gt; asyncResult, &lt;span style="color:#2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;IAsyncResult&lt;/span&gt;, TResult&amp;gt; endMethod)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;br&gt;         {&lt;br&gt;             &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; result = endMethod(asyncResult);&lt;br&gt;             completionSource.TrySetResult(result);&lt;br&gt;         }&lt;br&gt;         &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;OperationCanceledException&lt;/span&gt;)&lt;br&gt;         {&lt;br&gt;             completionSource.TrySetCanceled();&lt;br&gt;         }&lt;br&gt;         &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt; genericException)&lt;br&gt;         {&lt;br&gt;             completionSource.TrySetException(genericException);&lt;br&gt;         }&lt;br&gt;     }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The previous code fragment defines a helper method that behaves similar to TaskFactory.&lt;/p&gt;  &lt;p&gt;Usage example:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:56a19ffa-7fee-4419-8139-4187004642f9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Usage:&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; client = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MyServiceClient&lt;/span&gt;();&lt;br&gt; &lt;span style="color:#008000"&gt;// EchoTaskAsync is an extension method&lt;/span&gt;&lt;br&gt; &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; result = &lt;span style="color:#0000ff"&gt;await&lt;/span&gt; client.EchoTaskAsync(&lt;span style="color:#a31515"&gt;&amp;quot;zzzz&amp;quot;&lt;/span&gt;);&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And here is the service extension for &lt;em&gt;MyServiceClient&lt;/em&gt; (Note that I use the service interface contract instead of the ClientBase&amp;lt;&amp;gt; as parameter since we need access to Begin/End methods):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d9d7628c-5b66-4b05-8fc1-f00614349507" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Service Async Extensions&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ServiceExtensions&lt;/span&gt;&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt; EchoTaskAsync(&lt;br&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IMyService&lt;/span&gt; client, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; text)&lt;br&gt;     {&lt;br&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MyTaskFactory&lt;/span&gt;.FromAsync&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(&lt;br&gt;             client.BeginEcho(text, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;),&lt;br&gt;             ar =&amp;gt; client.EndEcho(ar));&lt;br&gt;     }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Try it and let me know if it works for you..&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7754489" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Languages/default.aspx">Languages</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Async/default.aspx">Async</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>We are recruiting..</title><link>http://weblogs.asp.net/mjarguello/archive/2011/04/10/we-are-recruiting.aspx</link><pubDate>Sun, 10 Apr 2011 21:26:53 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7751139</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7751139</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/04/10/we-are-recruiting.aspx#comments</comments><description>&lt;p&gt;We are looking for smart and young .NET software developers, passionate about technology for our Mexico City office. If your are interested send us an email with your CV to &lt;a href="mailto:rrhh@lagash.com"&gt;rrhh@lagash.com&lt;/a&gt; specifying you are interested in Mexico City positions.&lt;/p&gt;  &lt;p&gt;Thanks!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7751139" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Offtopic/default.aspx">Offtopic</category></item><item><title>Team Foundation Server: Server-side Validation &amp; Interception</title><link>http://weblogs.asp.net/mjarguello/archive/2011/03/29/team-foundation-server-server-side-validation-amp-interception.aspx</link><pubDate>Tue, 29 Mar 2011 05:02:40 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7737311</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7737311</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/03/29/team-foundation-server-server-side-validation-amp-interception.aspx#comments</comments><description>&lt;p&gt;Some time ago I presented a simple way to &lt;a href="http://weblogs.asp.net/mjarguello/archive/2011/02/22/overwriting-tfs-web-services.aspx" target="_blank"&gt;version TFS Web Services&lt;/a&gt; in order to intercept and perform server side validations.&lt;/p&gt;  &lt;p&gt;In this post I will introduce another way of doing so.&lt;/p&gt;  &lt;p&gt;Check out the&amp;#160; (poor documented) &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.framework.server.iteamfoundationrequestfilter.aspx" target="_blank"&gt;ITeamFoundationRequestFilter&lt;/a&gt; interface in MSDN. This interface is part of an extensibility method called TFS Filters. &lt;/p&gt;  &lt;p&gt;* Many thanks to &lt;a href="http://blogs.msdn.com/b/granth/" target="_blank"&gt;Grant Holliday&lt;/a&gt; for pointing me to this extension.&lt;/p&gt;  &lt;p&gt;Using this interface as a regular TFS plug-in (meaning you deploy it in the plugins directory as you do with &lt;a href="http://www.codeproject.com/Articles/110953/Team-Foundation-Server-2010-Event-Handling-with-Su.aspx?display=Mobile" target="_blank"&gt;subscribers&lt;/a&gt;) you can inspect method executions, requests, etc.&lt;/p&gt;  &lt;p&gt;It is very useful when you need to create an audit log, measure performance (recording execution time or calls), diagnose connection problems, etc. In fact, when you connect to TFS from a version of Visual Studio&amp;#160; lower than 2010, an implementation of this filter (check the Microsoft.TeamFoundation.ApplicationTier.PlugIns.Core.UserAgentCheckingFilter) throws an exception indicating that you need a patch for doing so.&lt;/p&gt;  &lt;p&gt;The latter is the functionality I am personally more interested in: validations.&lt;/p&gt;  &lt;p&gt;The interface defines the following methods in order to handle a request life cycle (in chronological order):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;u&gt;BeginRequest&lt;/u&gt;: called when a new TFS request (ASP.NET) is about to be executed. At this phase, you &lt;u&gt;do not&lt;/u&gt; know which operation is about to be executed (at least not directly). &lt;/li&gt;    &lt;li&gt;&lt;u&gt;RequestReady&lt;/u&gt;: called when security and message validations has already happened (only at Web Service level). At this phase, you &lt;u&gt;do not&lt;/u&gt; know which operation is about to be executed (at least not directly). &lt;/li&gt;    &lt;li&gt;&lt;u&gt;EnterMethod&lt;/u&gt;: called when a logical TFS method is about to be called. At this phase, you now know which operation TFS is about to execute (and you even have its parameters). &lt;/li&gt;    &lt;li&gt;&lt;u&gt;LeaveMethod&lt;/u&gt;: called when a logical TFS method has already been executed. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;EndRequest&lt;/u&gt;: called when ASP.NET request is about to end. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Sample debugging session (method information available when EnterMethod is executed):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_27A8045E.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_723EA65E.png" width="583" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Turns out that you can only abort the execution of the current request in the BeginRequest and RequestReady methods&lt;/u&gt;: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The only way of doing so, is throwing an exception that inherits from &lt;em&gt;Microsoft.TeamFoundation.Framework.Server.RequestFilterException&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;At this phase (BeginRequest or RequestReady), you do not know yet which Method is being called by the client (at least not directly). &lt;/li&gt;    &lt;li&gt;Even if you throw exceptions from the EnterMethod method, you wouldn’t abort the current execution (there are some nice try-catch internal code preventing the error from aborting the execution). The exception will only be logged. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: As in my &lt;a href="http://weblogs.asp.net/mjarguello/archive/2011/02/22/overwriting-tfs-web-services.aspx" target="_blank"&gt;previous post&lt;/a&gt;, the next code sample is only meant to be an experiment in any case :).&lt;/p&gt;  &lt;p&gt;By doing some ASP.NET HttRequest manipulation thought, you can implement a validation filter in the RequestReady or BeginRequest methods. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Get the current ASP.NET HttpContext.Request &lt;/li&gt;    &lt;li&gt;Read the entire InputStream and then restore its original state (assuming it is not a forward only stream). &lt;/li&gt;    &lt;li&gt;Deserialize the SOAP Envelope and reading the parameters from there. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So… as I already made it clear, consider other alternatives before using this as production code.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:24b67131-c4c8-4aaa-a759-b2e665299b47" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;TFS Filter Sample&lt;/div&gt;      &lt;div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TeamFoundationRequestFilterSample&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ITeamFoundationRequestFilter&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; BeginRequest(&lt;span style="color: #2b91af"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Can abort here&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;TfsPackageValidator&lt;/span&gt;.ValidatePackage();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RequestReady(&lt;span style="color: #2b91af"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Can abort here&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; EndRequest(&lt;span style="color: #2b91af"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; EnterMethod(&lt;span style="color: #2b91af"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Cannot abort here&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LeaveMethod(&lt;span style="color: #2b91af"&gt;TeamFoundationRequestContext&lt;/span&gt; requestContext)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Cannot abort here&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The above sample code validates inputs in the BeginRequest method (you can always move it to the RequestReady). The TfsPackageValidator class inspects the current ASP.NET request and deserializes the input parameters. If it finds an &lt;em&gt;Update&lt;/em&gt; operation over a Work Item (by looking at the SOAP Message Body), it continues with the validation process. What we are looking for here, is the Package element with the update information about the work item.&lt;/p&gt;  &lt;p&gt;And here is my TfsPackageValidator class:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9fbb7999-8950-41f3-90ab-4dde2b4f11cd" class="wlWriterSmartContent"&gt;   &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;     &lt;div style="padding-bottom: 2px; padding-left: 5px; padding-right: 5px; font-family: verdana, tahoma, arial, sans-serif; background: #000080; color: #fff; font-weight: bold; padding-top: 2px"&gt;TfsPackageValidator class&lt;/div&gt;      &lt;div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; max-height: 500px; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TfsPackageValidator&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ValidatePackage()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; soapXml = ReadHttpContextInputStream();         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; packageElement = ReadUpdatePackageFromSoapEnvelope(soapXml);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (packageElement != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ValidatePackage(packageElement);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ValidatePackage(System.Xml.Linq.&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt; package)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; updateWorkItemElement =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; package.Descendants(&lt;span style="color: #a31515"&gt;&amp;quot;UpdateWorkItem&amp;quot;&lt;/span&gt;).FirstOrDefault();         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (updateWorkItemElement != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; priorityColumnElement =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; updateWorkItemElement.Descendants(&lt;span style="color: #a31515"&gt;&amp;quot;Column&amp;quot;&lt;/span&gt;).Where(         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c =&amp;gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)c.Attribute(&lt;span style="color: #a31515"&gt;&amp;quot;Column&amp;quot;&lt;/span&gt;) == &lt;span style="color: #a31515"&gt;&amp;quot;Microsoft.VSTS.Common.Priority&amp;quot;&lt;/span&gt;).FirstOrDefault();         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (priorityColumnElement != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; priority = 0;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; priorityText = priorityColumnElement.Descendants(&lt;span style="color: #a31515"&gt;&amp;quot;Value&amp;quot;&lt;/span&gt;).FirstOrDefault().Value;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(priorityText) &amp;amp;&amp;amp; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;.TryParse(priorityText, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; priority))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (priority &amp;gt; 2)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TeamFoundationRequestFilterException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Priorities grater than 2 are not allowed.&amp;quot;&lt;/span&gt;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt; ReadUpdatePackageFromSoapEnvelope(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; soapXml)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; soapDocument = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(soapXml);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; updateName =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;XName&lt;/span&gt;.Get(         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;Update&amp;quot;&lt;/span&gt;,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;http://schemas.microsoft.com/TeamFoundation/2005/06/WorkItemTracking/ClientServices/03&amp;quot;&lt;/span&gt;);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; updateElement =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; soapDocument.Descendants(updateName).FirstOrDefault();         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; updateElement;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ReadHttpContextInputStream()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; httpContext = System.Web.&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current;         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; soapXml = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; memoryStream = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[1024 * 4];         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; count = 0;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; ((count = httpContext.Request.InputStream.Read(buffer, 0, buffer.Length)) &amp;gt; 0)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memoryStream.Write(buffer, 0, count);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memoryStream.Seek(0, &lt;span style="color: #2b91af"&gt;SeekOrigin&lt;/span&gt;.Begin);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; httpContext.Request.InputStream.Seek(0, &lt;span style="color: #2b91af"&gt;SeekOrigin&lt;/span&gt;.Begin);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; soapXml = &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.UTF8.GetString(memoryStream.GetBuffer());         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; soapXml;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Try running this code when saving a Work Item with a priority field (by editing a single Work Item. If you edit the work item in a query view, the message passed to the server would be slightly different). You should see something similar to the following message in the client application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_WxpsgMtNFwY/TZFmKOEjm5I/AAAAAAAAAEY/6pF0jYol6L8/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_WxpsgMtNFwY/TZFmLjT3jPI/AAAAAAAAAEc/D2Zy5RMRLB4/image_thumb%5B4%5D.png?imgmax=800" width="349" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The exception message is displayed in the dialog box (as a Technical information for administrator).&lt;/p&gt;  &lt;p&gt;Download the &lt;a href="http://7ycqya.blu.livefilestore.com/y1pvlSg3d_r9YxeHow_NIhV3O6yXzTvOIp1atfWiPsJZAYlKOO25kZroWZkED_5kXPGf5FJUBPwqYlZXvCOaSuNOgEFKovmDWNK/TeamFoundationRequestFilterSample.zip?download&amp;amp;psid=1"&gt;sample code&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7737311" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/TFS/default.aspx">TFS</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/ALM/default.aspx">ALM</category></item><item><title>Webcast MSDN: Migración y construcción de aplicaciones para Windows Azure con VM Role y el modo de administración</title><link>http://weblogs.asp.net/mjarguello/archive/2011/03/24/webcast-msdn-migraci-243-n-y-construcci-243-n-de-aplicaciones-para-windows-azure-con-vm-role-y-el-modo-de-administraci-243-n.aspx</link><pubDate>Fri, 25 Mar 2011 03:34:08 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7731796</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7731796</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/03/24/webcast-msdn-migraci-243-n-y-construcci-243-n-de-aplicaciones-para-windows-azure-con-vm-role-y-el-modo-de-administraci-243-n.aspx#comments</comments><description>&lt;p&gt;I will participating in a new Screencast tomorrow about new Azure features requested by the community. Admin mode and VM Role.&lt;/p&gt;  &lt;p&gt;Click &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032475431&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" target="_blank"&gt;here&lt;/a&gt; to join.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7731796" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Azure/default.aspx">Azure</category></item><item><title>Asynchrony in C# 5: Dataflow Async Logger Sample</title><link>http://weblogs.asp.net/mjarguello/archive/2011/03/15/asynchrony-in-c-5-dataflow-async-logger-sample.aspx</link><pubDate>Tue, 15 Mar 2011 06:20:52 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7724047</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7724047</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/03/15/asynchrony-in-c-5-dataflow-async-logger-sample.aspx#comments</comments><description>&lt;p&gt;Check out this (very simple) code examples for TPL Dataflow. &lt;/p&gt;  &lt;p&gt;Suppose you are developing an Async Logger to register application events to different sinks or log writers.&lt;/p&gt;  &lt;p&gt;The logger architecture would be as follow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_06BF1DA8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_604D148F.png" width="550" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note how blocks can be composed to achieved desired behavior. The &lt;em&gt;BufferBlock&amp;lt;T&amp;gt;&lt;/em&gt; is the pool of log entries to be process whereas linked &lt;em&gt;ActionBlock&amp;lt;TInput&amp;gt;&lt;/em&gt; represent the log writers or sinks. &lt;/p&gt;  &lt;p&gt;The previous composition would allows &lt;u&gt;only one&lt;/u&gt; ActionBlock to consume entries at a time. &lt;/p&gt;  &lt;p&gt;Implementation code would be something similar to (add reference to System.Threading.Tasks.Dataflow.dll in %User Documents%\Microsoft Visual Studio Async CTP\Documentation):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8b5916b4-a2f6-4957-888e-45c8955b8c20" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;TPL Dataflow Logger&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; bufferBlock = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;BufferBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;();&lt;br&gt; &lt;br&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; infoLogger = &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;         e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;Info: {0}&amp;quot;&lt;/span&gt;, e.Item2));&lt;br&gt; &lt;br&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; errorLogger = &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;         e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;Error: {0}&amp;quot;&lt;/span&gt;, e.Item2));&lt;br&gt; &lt;br&gt; bufferBlock.LinkTo(infoLogger, e =&amp;gt; (e.Item1 &amp;amp; &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Info) != &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.None);&lt;br&gt; bufferBlock.LinkTo(errorLogger, e =&amp;gt; (e.Item1 &amp;amp; &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Error) != &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.None);&lt;br&gt; &lt;br&gt; bufferBlock.Post(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Info, &lt;span style="color:#a31515"&gt;&amp;quot;info message&amp;quot;&lt;/span&gt;));&lt;br&gt; bufferBlock.Post(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Error, &lt;span style="color:#a31515"&gt;&amp;quot;error message&amp;quot;&lt;/span&gt;));&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note the filter applied to each link (in this case, the Logging Level selects the writer used). We can specify message filters using Predicate functions on each link. &lt;/p&gt;  &lt;p&gt;Now, the previous sample is useless for a Logger since Logging Level is not exclusive (thus, several writers could be used to process a single message).&lt;/p&gt;  &lt;p&gt;Let´s use a &lt;em&gt;Broadcast&amp;lt;T&amp;gt;&lt;/em&gt; buffer instead of a &lt;em&gt;BufferBlock&amp;lt;T&amp;gt;&lt;/em&gt;.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:12a5c059-974c-4c22-ad41-5c7011f63372" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Broadcast Logger&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; bufferBlock = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;BroadcastBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;     e =&amp;gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(e.Item1, e.Item2));&lt;br&gt; &lt;br&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; infoLogger = &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;         e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;Info: {0}&amp;quot;&lt;/span&gt;, e.Item2));&lt;br&gt; &lt;br&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; errorLogger = &lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;         e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;Error: {0}&amp;quot;&lt;/span&gt;, e.Item2));&lt;br&gt; &lt;br&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; allLogger =&lt;br&gt;     &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ActionBlock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(&lt;br&gt;     e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;All: {0}&amp;quot;&lt;/span&gt;, e.Item2));&lt;br&gt; &lt;br&gt; bufferBlock.LinkTo(infoLogger, e =&amp;gt; (e.Item1 &amp;amp; &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Info) != &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.None);&lt;br&gt; bufferBlock.LinkTo(errorLogger, e =&amp;gt; (e.Item1 &amp;amp; &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Error) != &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.None);&lt;br&gt; bufferBlock.LinkTo(allLogger, e =&amp;gt; (e.Item1 &amp;amp; &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.All) != &lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.None);&lt;br&gt; &lt;br&gt; bufferBlock.Post(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Info, &lt;span style="color:#a31515"&gt;&amp;quot;info message&amp;quot;&lt;/span&gt;));&lt;br&gt; bufferBlock.Post(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Tuple&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#2b91af"&gt;LogLevel&lt;/span&gt;.Error, &lt;span style="color:#a31515"&gt;&amp;quot;error message&amp;quot;&lt;/span&gt;));&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As this block copies the message to all its outputs, we need to define the copy function in the block constructor. In this case we create a new Tuple, but you can always use the Identity function if passing the same reference to every output.&lt;/p&gt;  &lt;p&gt;Try both scenarios and compare the results.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7724047" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Languages/default.aspx">Languages</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Async/default.aspx">Async</category></item><item><title>Asynchrony in C# 5 (Part II)</title><link>http://weblogs.asp.net/mjarguello/archive/2011/03/14/asynchronous-in-c-5-part-ii.aspx</link><pubDate>Mon, 14 Mar 2011 22:15:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7723805</guid><dc:creator>javarg</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mjarguello/rsscomments.aspx?PostID=7723805</wfw:commentRss><comments>http://weblogs.asp.net/mjarguello/archive/2011/03/14/asynchronous-in-c-5-part-ii.aspx#comments</comments><description>&lt;p&gt;This article is a continuation of the series of asynchronous features included in the new &lt;a href="http://msdn.microsoft.com/en-us/vstudio/gg316360" target="_blank"&gt;Async CTP&lt;/a&gt; preview for next versions of C# and VB. Check out &lt;a href="http://weblogs.asp.net/mjarguello/archive/2011/03/13/asynchrony-in-c-5-part-i.aspx" target="_blank"&gt;Part I&lt;/a&gt; for more information.&lt;/p&gt;  &lt;p&gt;So, let’s continue with TPL Dataflow:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Asynchronous functions &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TPL Dataflow &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Task based asynchronous Pattern &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;Part II: TPL Dataflow&lt;/h4&gt;  &lt;p&gt;&lt;u&gt;Definition (&lt;em&gt;by quote of Async CTP doc&lt;/em&gt;)&lt;/u&gt;: “TPL Dataflow (TDF) is a new .NET library for building concurrent applications. It promotes actor/agent-oriented designs through primitives for in-process message passing, dataflow, and pipelining. TDF builds upon the APIs and scheduling infrastructure provided by the Task Parallel Library (TPL) in .NET 4, and integrates with the language support for asynchrony provided by C#, Visual Basic, and F#.”&lt;/p&gt;  &lt;p&gt;&lt;u&gt;This means&lt;/u&gt;: data manipulation processed asynchronously.&lt;/p&gt;  &lt;p&gt;“&lt;em&gt;TPL Dataflow is focused on providing building blocks for message passing and parallelizing CPU- and I/O-intensive applications&lt;/em&gt;”.&lt;/p&gt;  &lt;p&gt;Data manipulation is another hot area when designing asynchronous and parallel applications: how do you sync data access in a parallel environment? how do you avoid concurrency issues? how do you notify when data is available? how do you control how much data is waiting to be consumed? etc.&amp;#160; &lt;/p&gt;  &lt;h5&gt;Dataflow Blocks&lt;/h5&gt;  &lt;p&gt;TDF provides data and action processing blocks. Imagine having preconfigured data processing pipelines to choose from, depending on the type of behavior you want. The most basic block is the BufferBlock&amp;lt;T&amp;gt;, which provides an storage for some kind of data (instances of &amp;lt;T&amp;gt;). &lt;/p&gt;  &lt;p&gt;So, let’s review data processing blocks available. Blocks a categorized into three groups:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Buffering Blocks&lt;/li&gt;    &lt;li&gt;Executor Blocks&lt;/li&gt;    &lt;li&gt;Joining Blocks&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Think of them as electronic circuitry components :)..&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. BufferBlock&amp;lt;T&amp;gt;&lt;/strong&gt;: it is a FIFO (First in First Out) queue. You can Post data to it and then Receive it synchronously or asynchronously. It synchronizes data consumption for only one receiver at a time (you can have many receivers but only one will actually process it).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_2E0CFD11.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_1287FB0E.png" width="240" height="59" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. BroadcastBlock&amp;lt;T&amp;gt;&lt;/strong&gt;: same FIFO queue for messages (instances of &amp;lt;T&amp;gt;) but link the receiving event to all consumers (it makes the data available for consumption to N number of consumers). The developer can provide a function to make a copy of the data if necessary.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_154DB001.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_32072516.png" width="240" height="53" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3. WriteOnceBlock&amp;lt;T&amp;gt;&lt;/strong&gt;: it stores only one value and once it’s been set, it can never be replaced or overwritten again (immutable after being set). As with BroadcastBlock&amp;lt;T&amp;gt;, all consumers can obtain a copy of the value.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_43970FE1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_32CF6533.png" width="240" height="80" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;strong&gt;ActionBlock&amp;lt;TInput&amp;gt;&lt;/strong&gt;: this executor block allows us to define an operation to be executed when posting data to the queue. Thus, we must pass in a delegate/lambda when creating the block. Posting data will result in an execution of the delegate for each data in the queue.&lt;/p&gt;  &lt;p&gt;You could also specify how many parallel executions to allow (degree of parallelism).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_6667ABC4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_005B6BE7.png" width="240" height="61" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5. TransformBlock&amp;lt;TInput, TOutput&amp;gt;&lt;/strong&gt;: this is an executor block designed to transform each input, that is way it defines an output parameter. It ensures messages are processed and delivered in order.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_778B639A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_607CE25E.png" width="351" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6. TransformManyBlock&amp;lt;TInput, TOutput&amp;gt;&lt;/strong&gt;: similar to TransformBlock but produces one or more outputs from each input.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_6C9E5C85.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_7CCA247E.png" width="354" height="59" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;7. BatchBlock&amp;lt;T&amp;gt;&lt;/strong&gt;: combines N single items into one batch item (it buffers and batches inputs).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_3AE33F30.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_344FBFA0.png" width="338" height="59" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;8. JoinBlock&amp;lt;T1, T2, …&amp;gt;&lt;/strong&gt;: it generates tuples from all inputs (it aggregates inputs). Inputs could be of any type you want (T1, T2, etc.).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_1DAD7159.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_7B0932DD.png" width="401" height="67" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;9. BatchJoinBlock&amp;lt;T1, T2, …&amp;gt;&lt;/strong&gt;: aggregates tuples of collections. It generates collections for each type of input and then creates a tuple to contain each collection (Tuple&amp;lt;IList&amp;lt;T1&amp;gt;, IList&amp;lt;T2&amp;gt;&amp;gt;). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mjarguello/image_38B61A9A.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/mjarguello/image_thumb_63AE089F.png" width="388" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Next time I will show some examples of usage for each TDF block.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;* Images taken from Microsoft’s Async CTP documentation.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7723805" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Languages/default.aspx">Languages</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mjarguello/archive/tags/Async/default.aspx">Async</category></item></channel></rss>
