<?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>Omar AL Zabir blog on ASP.NET Ajax and .NET 3.5 : WWF</title><link>http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx</link><description>Tags: WWF</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Web 2.0 AJAX Portal using jQuery, ASP.NET 3.5, Silverlight, Linq to SQL, WF and Unity</title><link>http://weblogs.asp.net/omarzabir/archive/2009/04/09/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx</link><pubDate>Wed, 08 Apr 2009 18:32:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7035975</guid><dc:creator>oazabir</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/omarzabir/rsscomments.aspx?PostID=7035975</wfw:commentRss><comments>http://weblogs.asp.net/omarzabir/archive/2009/04/09/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://dropthings.omaralzabir.com" title="Dropthings Web 2.0 style AJAX portal" mce_href="http://dropthings.omaralzabir.com" target="_blank"&gt;Dropthings&lt;/a&gt; – my &lt;a href="http://www.codeplex.com/dropthings" title="Dropthings - Open Source AJAX Portal" mce_href="http://www.codeplex.com/dropthings" target="_blank"&gt;open source&lt;/a&gt; Web 2.0 Ajax Portal has gone through a technology overhauling. Previously it was built using ASP.NET AJAX, a little bit of Workflow Foundation and Linq to SQL. Now Dropthings boasts full &lt;b&gt;jQuery&lt;/b&gt; front-end combined with ASP.NET AJAX &lt;code&gt;UpdatePanel&lt;/code&gt;, &lt;b&gt;Silverlight widget&lt;/b&gt;, full &lt;b&gt;Workflow Foundation&lt;/b&gt; implementation on the business layer, 100% &lt;b&gt;Linq to SQL Compiled Queries&lt;/b&gt; on the data access layer, Dependency Injection and Inversion of Control (IoC) using &lt;b&gt;Microsoft Enterprise Library 4.1&lt;/b&gt; and &lt;b&gt;Unity&lt;/b&gt;. It also has a ASP.NET AJAX Web Test framework that makes it real easy to write Web Tests that simulates real user actions on AJAX web pages. This article will walk you through the challenges in getting these new technologies to work in an ASP.NET website and how performance, scalability, extensibility and maintainability has significantly improved by the new technologies. Dropthings has been licensed for commercial use by prominent companies including BT Business, Intel, Microsoft IS, Denmark Government portal for Citizens; Startups like Limead and many more. So, this is serious stuff! There’s a very cool open source implementation of Dropthings framework available at &lt;a href="http://nexus.nus.edu.sg/apicta" title="AJAX Portal at National University of Singapore" mce_href="http://nexus.nus.edu.sg/apicta" target="_blank"&gt;National University of Singapore&lt;/a&gt; portal.&lt;/p&gt;
&lt;p&gt;Visit: &lt;a href="http://dropthings.omaralzabir.com" mce_href="http://dropthings.omaralzabir.com"&gt;http://dropthings.omaralzabir.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://weblogs.asp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_57907290.png" mce_href="http://weblogs.asp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_57907290.png"&gt;&lt;img src="http://weblogs.asp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_37551A39.png" title="Dropthings AJAX Portal" style="border-width: 0px; display: inline;" alt="Dropthings AJAX Portal" mce_src="http://weblogs.asp.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/image_5F00_thumb_5F00_37551A39.png" border="0" width="600" height="529"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have published a new article on this on CodeProject:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/ajax/Web20Portal.aspx" title="Web 2.0 AJAX Portal using jQuery, ASP.NET 3.5, Silverlight, Linq to SQL, WF and Unity" mce_href="http://www.codeproject.com/KB/ajax/Web20Portal.aspx"&gt;http://www.codeproject.com/KB/ajax/Web20Portal.aspx&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Get the source code&lt;/h2&gt;
&lt;p&gt;Latest source code is hosted at Google code:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/dropthings" mce_href="http://code.google.com/p/dropthings"&gt;http://code.google.com/p/dropthings&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There’s a CodePlex site for documentation and issue tracking:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/dropthings" mce_href="http://www.codeplex.com/dropthings"&gt;http://www.codeplex.com/dropthings&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You will need Visual Studio 2008 Team Suite with Service Pack 1 and Silverlight 2 SDK in order to run all the projects. If you have only Visual Studio 2008 Professional, then you will have to remove the Dropthings.Test project.&lt;/p&gt;
&lt;h2&gt;New features introduced&lt;/h2&gt;
&lt;p&gt;Dropthings new release has the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Template users – you can define a user who’s pages and widgets are used as a template for new users. Whatever you put in that template user’s pages, it will be copied for every new user. Thus this is an easier way to define the default pages and widgets for new users. Similarly you can do the same for a registered user. The template users can be defined in the &lt;code&gt;web.config&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Widget-to-Widget communication – Widgets can send message to each other. Widgets can subscribe to an Event Broker and exchange messages using a Pub-Sub pattern. &lt;/li&gt;
&lt;li&gt;WidgetZone – you can create any number of zones in any shape on the page. You can have widgets laid in horizontal layout, you can have zones on different places on the page and so on. With this zone model, you are no longer limited to the Page-Column model where you could only have N vertical columns. &lt;/li&gt;
&lt;li&gt;Role based widgets – now widgets are mapped to roles so that you can allow different users to see different widget list using &lt;code&gt;ManageWidgetPersmission.aspx.&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Role based page setup – you can define page setup for different roles. For ex, Managers see different pages and widgets than Employees. &lt;/li&gt;
&lt;li&gt;Widget maximize – you can maximize a widget to take full screen. Handy for widgets with lots of content. &lt;/li&gt;
&lt;li&gt;Free form resize – you can freely resize widgets vertically. &lt;/li&gt;
&lt;li&gt;Silverlight Widgets – You can now make widgets in Silverlight! &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why the technology overhauling&lt;/h2&gt;
&lt;p&gt;Performance, Scalability, Maintainability and Extensibility – four key reasons for the overhauling. Each new technology solved one of more of these problems. &lt;/p&gt;
&lt;p&gt;First, jQuery was used to replace my personal hand-coded large amount of Javascript code that offered the client side drag &amp;amp; drop and other UI effects. jQuery already has a rich set of library for Drag &amp;amp; Drop, Animations, Event handling, cross browser javascript framework and so on. So, using jQuery means opening the door to thousands of jQuery plugins to be offered on Dropthings. This made Dropthings highly extensible on the client side. Moreover, jQuery is very light. Unlike AJAX Control Toolkit jumbo sized framework and heavy control extenders, jQuery is very lean. So, total javascript size decreased significantly resulting in improved page load time. In total, the jQuery framework, AJAX basic framework, all my stuffs are total 395KB, sweet! Performance is key; it makes or breaks a product.&lt;/p&gt;
&lt;p&gt;Secondly, Linq to SQL queries are replaced with Compiled Queries. Dropthings did not survive a load test when regular lambda expressions were used to query database. I could only reach up to 12 Req/Sec using 20 concurrent users without burning up web server CPU on a Quad Core DELL server. &lt;/p&gt;
&lt;p&gt;Thirdly, Workflow Foundation is used to build operations that require multiple Data Access Classes to perform together in a single transaction. Instead of writing large functions with many if…else conditions, for…loops, it’s better to write them in a Workflow because you can visually see the flow of execution and you can reuse Activities among different Workflows. Best of all, architects can design workflows and developers can fill-in code inside Activities. So, I could design a complex operations in a workflow without writing the real code inside Activities and then ask someone else to implement each Activity. It is like handing over a design document to developers to implement each unit module, only that here everything is strongly typed and verified by compiler. If you strictly follow Single Responsibility Principle for your Activities, which is a smart way of saying one Activity does only one and very simple task, you end up with a highly reusable and maintainable business layer and a very clean code that’s easily extensible.&lt;/p&gt;
&lt;p&gt;Fourthly, &lt;a href="http://www.codeplex.com/unity" title="Unity Dependency Injection framework" mce_href="http://www.codeplex.com/unity" target="_blank"&gt;Unity&lt;/a&gt; Dependency Injection (DI) framework is used to pave the path for unit testing and dependency injection. It offers Inversion of Control (IoC), which enables testing individual classes in isolation. Moreover, it has a handy feature to control lifetime of objects. Instead of creating instance of commonly used classes several times within the same request, you can make instances thread level, which means only one instance is created per thread and subsequent calls reuse the same instance. Are these going over your head? No worries, continue reading, I will explain later on.&lt;/p&gt;
&lt;p&gt;Fifthly, enabling API for Silverlight widgets allows more interactive widgets to be built using Silverlight. HTML and Javascripts still have limitations on smooth graphics and continuous transmission of data from web server. Silverlight solves all of these problems.&lt;/p&gt;
&lt;p&gt;Read the article for details on how all these improvements were done and how all these hot techs play together in a very useful open source project for enterprises.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/ajax/Web20Portal.aspx" title="Web 2.0 AJAX Portal using jQuery, ASP.NET 3.5, Silverlight, Linq to SQL, WF and Unity" mce_href="http://www.codeproject.com/KB/ajax/Web20Portal.aspx"&gt;http://www.codeproject.com/KB/ajax/Web20Portal.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Don’t forget to vote for me if you like it.&lt;/p&gt;
&lt;div class="wlWriterHeaderFooter" style="margin: 0px; padding: 4px; text-align: left;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/omar/archive/2009/04/08/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx" mce_href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/omar/archive/2009/04/08/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/omar/archive/2009/04/08/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=808080&amp;amp;cfgcolor=000000" mce_src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/omar/archive/2009/04/08/web-2-0-ajax-portal-using-jquery-asp-net-3-5-silverlight-linq-to-sql-wf-and-unity.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=808080&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7035975" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/omarzabir/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/ajax/default.aspx">ajax</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx">WWF</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/Unity/default.aspx">Unity</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>Memory Leak with delegates and workflow foundation</title><link>http://weblogs.asp.net/omarzabir/archive/2009/03/14/memory-leak-with-delegates-and-workflow-foundation.aspx</link><pubDate>Sat, 14 Mar 2009 09:37:15 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6959826</guid><dc:creator>oazabir</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/omarzabir/rsscomments.aspx?PostID=6959826</wfw:commentRss><comments>http://weblogs.asp.net/omarzabir/archive/2009/03/14/memory-leak-with-delegates-and-workflow-foundation.aspx#comments</comments><description>&lt;p&gt;Recently after Load Testing my open source project &lt;a href="http://www.dropthings.com" target="_blank"&gt;Dropthings&lt;/a&gt;, I encountered a lot of memory leak. I found lots of Workflow Instances and Linq Entities were left in memory and never collected. After profiling the web application using &lt;a title="Memory Profiler for .NET" href="http://memprofiler.com/" target="_blank"&gt;.NET Memory Profiler&lt;/a&gt;, it showed the real picture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_55EDBFD3.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="646" alt="image" src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_2E9F3CD2.png" width="605" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It shows you that instances of the several types are being created but not being removed. You see the “New” column has positive value, but the “Remove” column has 0. That means new instances are being created, but not removed. Basically the way you do Memory Profiling is, you take two snapshots. Say you take one snapshot when you first visit your website. Then you do some action on the website that results in allocation of objects. Then you take another snapshot. When you compare both snapshots, you can see how many instances of classes were created between these two snapshots and how many were removed. If they are not equal, then you have leak. Generally in web application many objects are created on every page hit and the end of the request, all those objects are supposed to be released. If they are not released, then we have a problem. But that’s the scenario for desktop applications because in a desktop application, objects can remain in memory until app is closed. But you should know best from the code which objects were supposed to go out of scope and get released.&lt;/p&gt;  &lt;p&gt;For beginners, leak means objects are being allocated but not being freed because someone is holding reference to the objects. When objects leak, they remain in memory forever, until the process (or app domain) is closed. So, if you have a leaky website, your website is continuously taking up memory until it runs out of memory on the web server and thus crash. So, memory leak is a bad – it prevents you from running your product for long duration and requires frequent restart of app pool. &lt;/p&gt;  &lt;p&gt;So, the above screenshot shows Workflow and Linq related classes are not being removed, and thus leaking. This means somewhere workflow instances are not being released and thus all workflow related objects are remaining. You can see the number is same 48 for all workflow related objects. This is a good indication that, almost every instance of workflow is leaked because there were total 48 workflows created and ran. Moreover it indicates we have a leak from a top Workflow instance level, not in some specific Activity or somewhere deep in the code.&lt;/p&gt;  &lt;p&gt;As the workflows use Linq stuff, they held reference to the Linq stuffs and thus the Linq stuffs leaked as well. Sometimes you might be looking for why A is leaking. But you actually end up finding that since B was holding reference to A and B was leaking and thus A was leaking as well. This is sometimes tricky to figure out and you spend a lot of time looking at the wrong direction.&lt;/p&gt;  &lt;p&gt;Now let me show you the buggy code:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ManualWorkflowSchedulerService manualScheduler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;  workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ManualWorkflowSchedulerService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;();

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance instance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;CreateWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Start&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompletedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompletedEventArgs e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 1. instance&lt;/span&gt;
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;; &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 2. terminatedhandler&lt;/span&gt;

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// copy the output parameters in the specified properties dictionary
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Enumerator &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;            e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OutputParameters&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetEnumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;while&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;( &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;MoveNext&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;() )
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;KeyValuePair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Current&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;( &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ContainsKey&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Key&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) )
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;[&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Key&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;] = &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Value&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
            }
        }
    }
};

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Exception &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;x  &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminatedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminatedEventArgs e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 3. instance&lt;/span&gt;
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;; &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 4. completeHandler&lt;/span&gt;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Debug&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WriteLine&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;( &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;x &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
    }
};

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;manualScheduler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;RunWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Can you spot the code where it leaked?&lt;/p&gt;

&lt;p&gt;I have numbered the lines in comment where the leak is happening. Here the &lt;code&gt;delegate&lt;/code&gt; is acting like a closure and those who are from Javascript background know closure is evil. They leak memory unless very carefully written. Here the &lt;code&gt;delegate&lt;/code&gt; keeps a reference to the &lt;code&gt;instance&lt;/code&gt; object. So, if somehow &lt;code&gt;delegate&lt;/code&gt; is not released, the &lt;code&gt;instance&lt;/code&gt; will remain in memory forever and thus leak. Now can you find a situation when the &lt;code&gt;delegate&lt;/code&gt; will not be released?&lt;/p&gt;

&lt;p&gt;Say the workflow completed. It will fire the &lt;font color="#990000"&gt;completeHandler&lt;code&gt;. &lt;/code&gt;&lt;/font&gt;But the &lt;code&gt;completeHandler&lt;/code&gt; will not release the &lt;code&gt;terminateHandler&lt;code&gt;. &lt;/code&gt;&lt;/code&gt;Thus the &lt;code&gt;terminateHandler&lt;/code&gt; remains in memory and it also holds reference to the &lt;code&gt;instance&lt;/code&gt;. So, we have a leaky &lt;code&gt;delegate&lt;/code&gt; leaking whatever it is holding onto outside it’s scope. Here the only thing outside the scope if the &lt;code&gt;instance&lt;/code&gt;, which it is tried to access from the parent function.&lt;/p&gt;

&lt;p&gt;Since the workflow instance is not released, all the properties the workflow and all the activities inside it are holding onto remains in memory. Most of the workflows and activities expose public properties which are Linq Entities. Thus the Linq Entities remain in memory. Now Linq Entities keep a reference to the &lt;code&gt;DataContext&lt;/code&gt; from where it is produced. Thus we have &lt;code&gt;DataContext&lt;/code&gt; remaining in memory. Moreover, &lt;code&gt;DataContext&lt;/code&gt; keeps reference to many internal objects and metadata cacahe, so they remain in memory as well.&lt;/p&gt;

&lt;p&gt;So, the correct code is:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;ManualWorkflowSchedulerService &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;manualScheduler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;ManualWorkflowSchedulerService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;();

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowInstance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;CreateWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Start&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;var &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowCompletedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowCompletedEventArgs &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 1. instanceId is a Guid&lt;/span&gt;
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// copy the output parameters in the specified properties dictionary
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Enumerator &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OutputParameters&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetEnumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;while&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;( &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;MoveNext&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;() )
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;KeyValuePair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;enumerator&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Current&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;( &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ContainsKey&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Key&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) )
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;properties&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;[&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Key&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;] = &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;pair&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Value&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
            }
        }
    }
};

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Exception &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;x  &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowTerminatedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowTerminatedEventArgs &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;) &lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 2. instanceId is a Guid&lt;/span&gt;
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;x &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Debug&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WriteLine&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
    }
};

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;

&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;manualScheduler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;RunWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
&lt;span style="background: #3f3f3f; color: #7f9f7f"&gt;// 3. Both delegates are now released&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;terminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowRuntime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;completedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;There are two changes – in both delegates, the &lt;code&gt;instanceId&lt;/code&gt; variable is passed, instead of the instance. Since &lt;code&gt;instanceId&lt;/code&gt; is a &lt;code&gt;Guid&lt;/code&gt;, which is a struct type data type, not a class, there’s no issue of referencing. Structs are copied, not referenced. So, they don’t leak memory. Secondly, both &lt;code&gt;delegate&lt;/code&gt;s are released at the end of the workflow execution, thus releasing both references.&lt;/p&gt;

&lt;p&gt;In Dropthings, I am using the famous &lt;a title="CallWorkflow Activity" href="http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,7be9fb53-0ddf-4633-b358-01c3e9999088.aspx" target="_blank"&gt;CallWorkflow Activity by John Flanders&lt;/a&gt;, which is widely used to execute one Workflow from another synchronously. There’s a &lt;code&gt;CallWorkflowService&lt;/code&gt; class which is responsible for synchronously executing another workflow and that has similar memory leak problem. The original code of the service is as following:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public class &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;CallWorkflowService &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;: &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowRuntimeService
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#region &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Methods

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public void &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;StartWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Type &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;inparms&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;           Guid &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;IComparable &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowRuntime wr &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance wi &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;CreateWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;inparms&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Start&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ManualWorkflowSchedulerService ss &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;             &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ManualWorkflowSchedulerService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;();
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ss &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;!= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ss&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;RunWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompletedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;d  &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;d &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompletedEventArgs e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;==&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;d&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance c &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;EnqueueItem&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OutputParameters&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
            }
        };
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminatedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;te &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;te &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminatedEventArgs e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;-= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;te&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance c &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;EnqueueItem&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;new &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #c89191"&gt;&amp;quot;Called Workflow Terminated&amp;quot;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;br /&gt;                  &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;), &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
            }
        };
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;d&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;te&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
    }

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#endregion &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Methods
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;As you see, it has that same delegate holding reference to instance object problem. Moreover, there’s some queue stuff there, which requires the &lt;code&gt;caller&lt;/code&gt; and &lt;code&gt;qn&lt;/code&gt; parameter passed to the &lt;code&gt;StartWorkflow&lt;/code&gt; function. So, not a straight forward fix. &lt;/p&gt;

&lt;p&gt;I tried to rewrite the whole &lt;code&gt;CallWorkflowService&lt;/code&gt; so that it does not require two delegates to be created per Workflow. Then I took the delegates out. Thus there’s no chance of closure holding reference to unwanted objects. The result looks like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public class &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;CallWorkflowService &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;: &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowRuntimeService
&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;{
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#region &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Fields

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;private &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowCompletedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_CompletedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;private &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowTerminatedEventArgs&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_TerminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;private &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Guid&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;       new &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Guid&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;();

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#endregion &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Fields

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#region &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Methods

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public void &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;StartWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Type &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Dictionary&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;string&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt; &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;inparms&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Guid &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;IComparable &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowRuntime &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowInstance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;CreateWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;workflowType&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;,&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;inparms&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Start&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;var &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;[&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;] = &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;new &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;{ &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Caller &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;};

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;ManualWorkflowSchedulerService &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ss &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;           wr&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;ManualWorkflowSchedulerService&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;&amp;gt;();
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ss &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;!= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ss&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;RunWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wi&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
    }

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;protected override void &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OnStarted&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;()
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;base&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OnStarted&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_CompletedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_CompletedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowCompletedEventArgs &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;var &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ContainsKey&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;))
                {
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;[&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;];
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowInstance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;EnqueueItem&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OutputParameters&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Remove&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                }
            };
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowCompleted &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_CompletedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        }

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;== &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_TerminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
        {
            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_TerminatedHandler &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;delegate&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;object &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;o&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowTerminatedEventArgs &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;)
            {
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;var &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowInstance&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;InstanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
                &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;if &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;ContainsKey&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;))
                {
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;[&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;];
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;WorkflowInstance &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;GetWorkflow&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;c&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;EnqueueItem&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;wf&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;                      new &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #f0dfaf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #c89191"&gt;&amp;quot;Called Workflow Terminated&amp;quot;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;e&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Exception&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;), &lt;br /&gt;&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;                      null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;, &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;null&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Remove&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;(&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;instanceId&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;);
                }
            };

            &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;this&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Runtime&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;WorkflowTerminated &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;+= &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_TerminatedHandler&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        }
    }

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;protected override void &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OnStopped&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;()
    {
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;_WorkflowQueue&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Clear&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;base&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;.&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;OnStopped&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;();
    }

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#endregion &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Methods

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#region &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Nested Types

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;private struct &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;WorkflowInfo
    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;{
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#region &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Fields

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;Guid &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;Caller&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;
        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #eaeaac"&gt;public &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #2b91af"&gt;IComparable &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfdfbf"&gt;qn&lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;;

        &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#endregion &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Fields
    }

    &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dfaf8f"&gt;#endregion &lt;/span&gt;&lt;span style="background: #3f3f3f; color: #dcdccc"&gt;Nested Types
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;After fixing the problem, another Memory Profile result showed the leak is gone:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_1E50E34F.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="601" alt="image" src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_2FBD3028.png" width="564" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As you see, the numbers vary, which means there’s no consistent leak. Moreover, looking at the types that remains in memory, they look more like metadata than instances of classes.&amp;#160; So, they are basically cached instances of metadata, not instances allocated during workflow execution which are supposed to be freed. So, we solved the memory leak!&lt;/p&gt;

&lt;p&gt;Now you know how to write anonymous delegates without leaking memory and how to run workflow without leaking them. Basically, the principle theory is – if you are referencing some outside object from an anonymous &lt;code&gt;delegate&lt;/code&gt;, make sure that object is not holding reference to the &lt;code&gt;delegate&lt;/code&gt; in some way, may be directly or may be via some child objects of its own. Because then you have a circular reference. If possible, do not try to access objects e.g. &lt;code&gt;instance&lt;/code&gt; inside an anonymous delegate that is declared outside the delegate. Try accessing instrinsic data types like int, string, DateTime, Guid etc which are not reference type variables. So, instead of referencing to an object, you should declare local variables e.g. &lt;code&gt;instanceId&lt;/code&gt; that gets the value of properties (e.g. &lt;code&gt;instance.InstanceId&lt;/code&gt;) from the object and then use those local variables inside the anonymous delegate.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left; margin:0px; padding:4px 4px 4px 4px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://weblogs.asp.net/omarzabir/archive/2009/03/14/memory-leak-with-delegates-and-workflow-foundation.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://weblogs.asp.net/omarzabir/archive/2009/03/14/memory-leak-with-delegates-and-workflow-foundation.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=808080&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6959826" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/omarzabir/archive/tags/.net/default.aspx">.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/SQL+server/default.aspx">SQL server</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx">WWF</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Strongly typed workflow input and output arguments</title><link>http://weblogs.asp.net/omarzabir/archive/2008/12/27/strongly-typed-workflow-input-and-output-arguments.aspx</link><pubDate>Sat, 27 Dec 2008 15:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6808073</guid><dc:creator>oazabir</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/omarzabir/rsscomments.aspx?PostID=6808073</wfw:commentRss><comments>http://weblogs.asp.net/omarzabir/archive/2008/12/27/strongly-typed-workflow-input-and-output-arguments.aspx#comments</comments><description>&lt;p&gt;When you run a &lt;u&gt;Workflow&lt;/u&gt; using Workflow Foundation, you pass arguments to the workflow in a &lt;u&gt;Dictionary&lt;/u&gt; form where the type of Dictionary is &lt;u&gt;Dictionary&amp;lt;string, object&amp;gt;&lt;/u&gt;. This means you miss the strong typing features of .NET languages. You have to know what arguments the workflow expects by looking at the &lt;u&gt;Workflow&lt;/u&gt; public properties. Moreover, there’s no way to make arguments required. You pass parameter, expect it to run, if it throws exception, you pass more arguments, hope it works now. Similarly, if you are running workflow synchronously using &lt;u&gt;ManualWorkflowSchedulerService&lt;/u&gt;, you expect return arguments from the Workflow immediately, but there again, you have to rely on the &lt;u&gt;Dictionary&lt;/u&gt; key and value pair. No strong typing there as well.&lt;/p&gt;  &lt;p&gt;In order to solve this, so that you could pass Workflow arguments as strongly typed classes, you can establish a format that every &lt;u&gt;Workflow&lt;/u&gt; has only two arguments named "Request” and “Response” and none other. Whatever needs to be passed to the &lt;u&gt;Workflow&lt;/u&gt; and expected out of it, must be passed via Request and must be expected via Response properties. Now the type of these arguments can be workflow specific, it can be any class with one or more parameters. This way, you could write code like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_59E1755A.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_59E1755A.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_062A0E0D.png" title="Running workflow with strongly typed argument" style="border-width: 0px; display: inline;" alt="Running workflow with strongly typed argument" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_062A0E0D.png" border="0" width="657" height="100"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The advantages of these strongly typed approach are: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Compile time validation of input parameters passed to workflow. No risk of passing unexpected object in Dictionary’s &lt;u&gt;object&lt;/u&gt; type value. &lt;/li&gt;    &lt;li&gt;Enforce required values by creating Request objects with non-default constructor. &lt;/li&gt;    &lt;li&gt;Establish a fixed contract for Workflow input and output via the strongly typed Request and Response classes or interfaces. &lt;/li&gt;    &lt;li&gt;Validate input arguments for the Workflow directly from the Request class, without going through the overhead of running a workflow. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If we follow this approach, we create workflows with only two &lt;u&gt;DependencyProperty&lt;/u&gt;, one for &lt;u&gt;Request&lt;/u&gt; and one for &lt;u&gt;Response&lt;/u&gt;. Showing you an example from my open source project &lt;a href="http://www.codeplex.com/dropthings" title="Dropthings - Open Source AJAX Start Page" mce_href="http://www.codeplex.com/dropthings" target="_blank"&gt;Dropthings&lt;/a&gt;, which uses Workflow for the entire Business Layer. Below you see the Workflow that executes when a new user visits &lt;a href="http://dropthings.omaralzabir.com" mce_href="http://dropthings.omaralzabir.com"&gt;http://dropthings.omaralzabir.com&lt;/a&gt;, creates a new user and setups all the pages and widgets for the user. It has only two &lt;u&gt;Dependency&lt;/u&gt; property – Request and Response.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_11DF553F.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_11DF553F.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_7B88EE52.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_7B88EE52.png" border="0" width="595" height="547"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The Request parameters is of type &lt;u&gt;IUserVisitWorkflowRequest&lt;/u&gt;. So, you can pass any class as Request argument that implements the interface. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_7E01FA43.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_7E01FA43.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_74C5BF02.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_74C5BF02.png" border="0" width="637" height="69"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here I have used fancy inheritance to create Request object hierarchy. You don’t need to do that. Just remember, you can pass any class. You don’t even need to use interface for Request parameter. It can be a class directly. I use all these interfaces in order to facilitate Dependency Inversion.&lt;/p&gt;  &lt;p&gt;Similarly, the Response object is also a class.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_209612F2.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_209612F2.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_2413E235.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_2413E235.png" border="0" width="656" height="117"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Response returns quite some properties. So, it’s kinda handy to wrap them all in one property.&lt;/p&gt;  &lt;p&gt;So, there you have it, strongly typed Workflow arguments. You can attach properties of the Request object to any activity directly form the designer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_4858C6B7.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_4858C6B7.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_01AB6548.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_01AB6548.png" border="0" width="534" height="520"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There’s really no compromise to make in this approach. Everything works as before.&lt;/p&gt;  &lt;p&gt;In order to make workflow execution simpler, I use a helper method like the following, that takes the Request and Response object and creates the Dictionary for me. This Dictionary always contains one “Request” and one “Response” entry.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_3C9F6B86.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_3C9F6B86.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_1869EB2A.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_1869EB2A.png" border="0" width="498" height="196"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This way, I can run Workflow in strongly typed fashion:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/omarzabir/image_4E8B6379.png" mce_href="http://weblogs.asp.net/blogs/omarzabir/image_4E8B6379.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_69940CBA.png" title="image" style="display: inline;" alt="image" mce_src="http://weblogs.asp.net/blogs/omarzabir/image_thumb_69940CBA.png" border="0" width="646" height="144"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Here I can specify the Request, Response and Workflow type using strong typing. This way I get strongly typed return object as well as pass strongly type Request object. There’s no dictionary building, no risky string key and object type value passing.&amp;nbsp; You can ignore the &lt;u&gt;ObjectContainer.Resolve()&lt;/u&gt; stuff, because that’s just returning me an existing reference of &lt;u&gt;WorkflowRuntime&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Hope you like this approach.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin: 0px; padding: 4px; text-align: left;"&gt;&lt;script type="text/javascript"&gt;var dzone_url = 'http://weblogs.asp.net/omarzabir/archive/2008/12/27/strongly-typed-workflow-input-and-output-arguments.aspx';&lt;/script&gt;&lt;script type="text/javascript"&gt;var dzone_title = 'Strongly typed workflow input and output arguments';&lt;/script&gt;&lt;script type="text/javascript"&gt;var dzone_blurb = 'Strongly typed workflow input and output arguments';&lt;/script&gt;&lt;script type="text/javascript"&gt;var dzone_style = '2';&lt;/script&gt;&lt;script src="http://widgets.dzone.com/widgets/zoneit.js" language="javascript" mce_src="http://widgets.dzone.com/widgets/zoneit.js"&gt;&lt;/script&gt; &lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6808073" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/omarzabir/archive/tags/.net/default.aspx">.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/architecture/default.aspx">architecture</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx">WWF</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/General+Software+Development/default.aspx">General Software Development</category></item><item><title>My first book - Building a Web 2.0 Portal with ASP.NET 3.5</title><link>http://weblogs.asp.net/omarzabir/archive/2008/01/14/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx</link><pubDate>Sun, 13 Jan 2008 20:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5599942</guid><dc:creator>oazabir</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/omarzabir/rsscomments.aspx?PostID=5599942</wfw:commentRss><comments>http://weblogs.asp.net/omarzabir/archive/2008/01/14/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx#comments</comments><description>&lt;p&gt;My first book "&lt;a href="http://www.oreilly.com/catalog/9780596510503/" mce_href="http://www.oreilly.com/catalog/9780596510503/" target="_blank"&gt;Building a Web 2.0 Portal with ASP.NET 3.5&lt;/a&gt;" from O'Reilly is published and available in the stores. This book explains in detail the architecture design, development, test, deployment, performance and scalability challenges of my open source web portal &lt;a href="http://dropthings.omaralzabir.com" mce_href="http://dropthings.omaralzabir.com"&gt;http://dropthings.omaralzabir.com&lt;/a&gt;. Dropthings is a prototype of a web portal similar to &lt;a href="http://www.google.com/ig" mce_href="http://www.google.com/ig" target="_blank"&gt;iGoogle&lt;/a&gt; or &lt;a href="http://www.pageflakes.com" mce_href="http://www.pageflakes.com" target="_blank"&gt;Pageflakes&lt;/a&gt;. But this portal is developed using recently released brand new technologies like ASP.NET 3.5, C# 3.0, Linq to Sql, Linq to XML, and Windows Workflow foundation. It makes heavy use of ASP.NET AJAX 1.0. Throughout my career I have built several state-of-the-art &lt;a href="http://omar.mvps.org" mce_href="http://omar.mvps.org" target="_blank"&gt;personal&lt;/a&gt;, educational, enterprise and &lt;a href="http://www.pageflakes.com" mce_href="http://www.pageflakes.com" target="_blank"&gt;mass consumer web portals&lt;/a&gt;. This book collects my experience in building all of those portals. &lt;/p&gt;  &lt;p&gt;Disclaimer: This book does not show you how to build Pageflakes. Dropthings is entirely different in terms of architecture, implementation and the technologies involved.&lt;/p&gt;  &lt;p&gt;You learn how to: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Implement a highly decoupled architecture following the popular n-tier, widget-based application model &lt;/li&gt;    &lt;li&gt;Provide drag-and-drop functionality, and use ASP.NET 3.5 to build the server-side part of the web layer &lt;/li&gt;    &lt;li&gt;Use LINQ to build the data access layer, and Windows Workflow Foundation to build the business layer as a collection of workflows &lt;/li&gt;    &lt;li&gt;Build client-side widgets using JavaScript for faster performance and better caching &lt;/li&gt;    &lt;li&gt;Get maximum performance out of the ASP.NET AJAX Framework for faster, more dynamic, and scalable sites &lt;/li&gt;    &lt;li&gt;Build a custom web service call handler to overcome shortcomings in ASP.NET AJAX 1.0 for asynchronous, transactional, cache-friendly web services &lt;/li&gt;    &lt;li&gt;Overcome JavaScript performance problems, and help the user interface load faster and be more responsive &lt;/li&gt;    &lt;li&gt;Solve various scalability and security problems as your site grows from hundreds to millions of users &lt;/li&gt;    &lt;li&gt;Deploy and run a high-volume production site while solving software, hardware, hosting, and Internet infrastructure problems &lt;/li&gt; &lt;/ul&gt; If you're ready to build state-of-the art, high-volume web applications that can withstand millions of hits per day, this book has exactly what you need.&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5599942" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/omarzabir/archive/tags/.net/default.aspx">.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/ajax/default.aspx">ajax</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/javascript/default.aspx">javascript</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/performance/default.aspx">performance</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/production/default.aspx">production</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx">WWF</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Synchronously execute and get return parameters from Workflow</title><link>http://weblogs.asp.net/omarzabir/archive/2007/10/22/synchronously-execute-and-get-return-parameters-from-workflow.aspx</link><pubDate>Mon, 22 Oct 2007 02:59:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4684786</guid><dc:creator>oazabir</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/omarzabir/rsscomments.aspx?PostID=4684786</wfw:commentRss><comments>http://weblogs.asp.net/omarzabir/archive/2007/10/22/synchronously-execute-and-get-return-parameters-from-workflow.aspx#comments</comments><description>&lt;P&gt;In my &lt;A class="" href="http://www.dropthings.com/" mce_href="http://www.dropthings.com"&gt;DropThings&lt;/A&gt; project, I have used Workflows to develop the business layer that run synchronously and do most of the work in the middle-tier. The business layer facade named &lt;EM&gt;DashboardFacade&lt;/EM&gt; has no code but to call different workflows. Each of the workflow serve a particular operation like new user visit, existing user visit, adding a tab, moving a widget from one column to another etc. ASP.NET page calls &lt;EM&gt;DashboardFacade&lt;/EM&gt; for each user action and &lt;EM&gt;DashboardFacade&lt;/EM&gt; inturn calls a workflow to respond to that user action.&lt;/P&gt;
&lt;P&gt;“This is insane!” you are thinking. I know. Please hear me out why I went for this approach:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Architects can “Design” business&amp;nbsp;facade functions&amp;nbsp;in terms of Activities and developers can just fill in small amount of unit code in each activity.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This is a really good reason because Architects can save time in writing Word Documents explaining how things should work. They can directly go into Workflow Designer, design the activities, connect them, design the flow, and verify whether all input and output are properly mapped or not. This is lot better than drawing flow-charts, writing pseudocode, explaining in stylish text how an operation should work. It is also helpful for developers because they can see the workflow and easily understand how to craft the whole operation. They just open up each activity and write small amount of very specific reusable code. They know what will be the input to the Activity (like function parameters) and they know what to produce (return value of function). This makes the activities reusable and architects can reuse one activity in many workflows. Workflows can be debugged right on Visual Studio Workflow Designer. So, developers can easily find out defects in their implementation by debugging the workflow. Architects can enforce many standards like validations, input output check, Fault handling on the workflow. Developers cannot but comply with those and thus produce really good code. Another great benefit for both architect and developer is that there’s no need to keep a separate technical specification document up-to-date because the workflow is always up-to-date and it speaks for itself. If someone wants to study how a particular operation works, one can just printout the workflow and read it through. &lt;/P&gt;
&lt;P&gt;“But what about performance”, you say? Both you and I have heard workflow foundation is a pretty big library and can be memory hog. Also the workflow runtime is quite big and takes time to start up. I did some profiling on the overhead of workflow execution and it is very fast for synchronous execution. Here's proof from the log you get in Visual Studio output window: &lt;BR&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; b030692b-5181-41f9-a0c3-69ce309d9806 Activity: Get User Guid        0.078125&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; b030692b-5181-41f9-a0c3-69ce309d9806 Activity: Get User Pages       0.0625&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt; b030692b-5181-41f9-a0c3-69ce309d9806 Activity: Get User Setting     0.046875&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; b030692b-5181-41f9-a0c3-69ce309d9806 Activity: Get Widgets in page: 189 0.0625&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt; b030692b-5181-41f9-a0c3-69ce309d9806 Total: Existing user visit     0.265625&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;First four entries are the time taken by individual activities during data access only, not the total time taken to execute the whole activity. The time entries here are in seconds and the first four entries represent duration of database operations inside activities. The last one is the total time for running a workflow with the four activities shown above and some extra code. If you sum up all the individual activity execution time for database operations only, it is 0.2500 which is just 0.015625 sec less than the total execution time. This means, executing the workflow itself along with overhead of running activities takes around 0.015 sec which is almost nothing compared to the total effort of doing the complete operation. 
&lt;P&gt;An example of such workflow is as following:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; MoveWidgetInstance( &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; widgetInstanceId, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; toColumn, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; toRow )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt;( &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TimedLog(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;._UserName, &lt;SPAN class=str&gt;"Move Widget:"&lt;/SPAN&gt; + widgetInstanceId) )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;     var properties = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Dictionary&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;,&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt;     properties.Add(&lt;SPAN class=str&gt;"UserName"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;._UserName);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt;     properties.Add(&lt;SPAN class=str&gt;"WidgetInstanceId"&lt;/SPAN&gt;, widgetInstanceId);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt;     properties.Add(&lt;SPAN class=str&gt;"ColumnNo"&lt;/SPAN&gt;, toColumn);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:&lt;/SPAN&gt;     properties.Add(&lt;SPAN class=str&gt;"RowNo"&lt;/SPAN&gt;, toRow);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:&lt;/SPAN&gt;     &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:&lt;/SPAN&gt;     WorkflowHelper.ExecuteWorkflow( &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;( MoveWidgetInstanceWorkflow ), properties );&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:&lt;/SPAN&gt;   }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:&lt;/SPAN&gt; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;EM&gt;MoveWidgetInstance&lt;/EM&gt; is a method in &lt;EM&gt;DashboardFacade&lt;/EM&gt;. It just calls a workflow named &lt;EM&gt;MoveWidgetInstanceWorkflow&lt;/EM&gt; which does the job for moving a widget from one column to another, rearrange the widgets on the new column, pull up widgets on the old column to remove the empty space, and update all widgets positions. If&amp;nbsp;I wrote all these code in one function, it becomes quite a big function and requires documentation. But having a workflow means I have a flowchart of what's going on and I have some handy reusable Activities which I can reuse in other operations. &lt;/P&gt;
&lt;P&gt;Implementing business layer as workflows has three important requirements:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Execute workflow synchronoulsy within the ASP.NET request thread 
&lt;LI&gt;Get output parameters from workflow which is returned as return value from Business Facade methods 
&lt;LI&gt;Get exceptions raised from Activities in a synchronous manner inside the same request thread&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;WorkflowHelper&lt;/EM&gt; is a handy class I made, which makes use of Workflow a breeze, especially from ASP.NET. In the business layer, I need synchronous execution of workflow where the default implementation of Workflow Foundation is to work asynchronously. Moreover, I need return values from Workflows after their execution complete, which is not so easily supported due to asynchronous nature of workflow. Both of these require some tweaking with workflow runtime in order to successfully run in ASP.NET environment. You will find the source code of WorkflowHelper in the code zip file from &lt;A href="http://www.dropthings.com/" mce_href="http://www.dropthings.com"&gt;www.dropthings.com&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;WorkflowHelper.Init&lt;/EM&gt; function initializes Workflow Runtime for ASP.NET environment. It makes sure there’s only one workflow runtime per Application Domain. Workflow Runtime cannot be created twice in the same application domain. So, it stores the reference of the Workflow Runtime in Application Context.&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; WorkflowRuntime Init()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt;   WorkflowRuntime workflowRuntime;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;   &lt;SPAN class=rem&gt;// Running in local mode, create an return new runtime&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;( HttpContext.Current == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt; )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt;     workflowRuntime = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; WorkflowRuntime();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:&lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:&lt;/SPAN&gt;     &lt;SPAN class=rem&gt;// running in web mode, runtime is initialized only once per &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:&lt;/SPAN&gt;     &lt;SPAN class=rem&gt;// application&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:&lt;/SPAN&gt;     &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;( HttpContext.Current.Application[&lt;SPAN class=str&gt;"WorkflowRuntime"&lt;/SPAN&gt;] == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt; )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:&lt;/SPAN&gt;       workflowRuntime = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; WorkflowRuntime();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:&lt;/SPAN&gt;     &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:&lt;/SPAN&gt;       &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; HttpContext.Current.Application[&lt;SPAN class=str&gt;"WorkflowRuntime"&lt;/SPAN&gt;] &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; WorkflowRuntime;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:&lt;/SPAN&gt;   }   &lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;The initialization takes care of both ASP.NET and Console/Winforms mode. After the initialization, it registers &lt;EM&gt;ManualWorkflowSchedulerService&lt;/EM&gt;, which take care of synchronous execution of Workflow. &lt;EM&gt;Activities.CallWorkflowService&lt;/EM&gt; is a handy service&amp;nbsp;that&amp;nbsp;executes&amp;nbsp;workflow synchrnously from another workflow. &lt;A href="http://msmvps.com/blogs/omar/archive/2006/12/27/executing-one-workflow-from-another-synchronously.aspx" mce_href="http://msmvps.com/blogs/omar/archive/2006/12/27/executing-one-workflow-from-another-synchronously.aspx"&gt;Read this post for details.&lt;/A&gt;&amp;nbsp;These two services make Workflow Foundation usable from ASP.NET environment for practical scenarios. &lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; var manualService = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ManualWorkflowSchedulerService();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; workflowRuntime.AddService(manualService);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; var syncCallService = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Activities.CallWorkflowService();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt; workflowRuntime.AddService(syncCallService);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt; workflowRuntime.StartRuntime();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:&lt;/SPAN&gt; &lt;SPAN class=rem&gt;// on web mode, store the runtime in application context so that&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:&lt;/SPAN&gt; &lt;SPAN class=rem&gt;// it is initialized only once. On dekstop mode, ignore&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;( &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt; != HttpContext.Current )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:&lt;/SPAN&gt;   HttpContext.Current.Application[&lt;SPAN class=str&gt;"WorkflowRuntime"&lt;/SPAN&gt;] = workflowRuntime;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; workflowRuntime;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Workflow Runtime is initialized from Application_Start event in Global.asax. This ensures the initialization happens only once per App Domain.&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Application_Start(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e) &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt;   &lt;SPAN class=rem&gt;// Code that runs on application startup&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;   DashboardBusiness.WorkflowHelper.Init();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;The runtime is disposed from Application_End event in Gloabal.asax:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Application_End(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e) &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt;     &lt;SPAN class=rem&gt;//  Code that runs on application shutdown&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt;     DashboardBusiness.WorkflowHelper.Terminate();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;The most interesting function is the ExecuteWorkflow function which does the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Execute workflow synchronously 
&lt;LI&gt;Pass parameters to workflow 
&lt;LI&gt;Upon completion, get output parameters from workflow and return them&lt;BR&gt;Handle exceptions raised in Workflow and raise to ASP.NET exception handler&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;First ExecuteWorkflow creates an instance of Workflow and passes input parameters to it:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; ExecuteWorkflow( Type workflowType, Dictionary&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;,&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;&amp;gt; properties)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt;   WorkflowRuntime workflowRuntime = Init();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;   ManualWorkflowSchedulerService manualScheduler = workflowRuntime.GetService&amp;lt;ManualWorkflowSchedulerService&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt;   WorkflowInstance instance = workflowRuntime.CreateWorkflow(workflowType, properties);        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt;   instance.Start();&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;ManualWorkflowSchedulerService service executes the workflow synchronously. Next step is to hook WorkflowCompleted and WorkflowTerminated events of Workflow Runtime so that I can capture output parameters and exceptions and handle them properly.&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; EventHandler&amp;lt;WorkflowCompletedEventArgs&amp;gt; completedHandler = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; completedHandler = &lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt;(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; o, WorkflowCompletedEventArgs e)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e.WorkflowInstance.InstanceId ==instance.InstanceId)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt;     workflowRuntime.WorkflowCompleted -= completedHandler;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt;     &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt;     &lt;SPAN class=rem&gt;// copy the output parameters in the specified properties dictionary&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:&lt;/SPAN&gt;     Dictionary&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;,&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;&amp;gt;.Enumerator enumerator = e.OutputParameters.GetEnumerator();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:&lt;/SPAN&gt;     &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt;( enumerator.MoveNext() )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:&lt;/SPAN&gt;     {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:&lt;/SPAN&gt;       KeyValuePair&amp;lt;&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;,&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt;&amp;gt; pair = enumerator.Current;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:&lt;/SPAN&gt;       &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;( properties.ContainsKey(pair.Key) )&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:&lt;/SPAN&gt;       {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:&lt;/SPAN&gt;         properties[pair.Key] = pair.Value;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:&lt;/SPAN&gt;       }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:&lt;/SPAN&gt;     }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:&lt;/SPAN&gt;   }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:&lt;/SPAN&gt; };&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;When workflow completes, WorkflowCompletedEventArgs gives me the OutputParameters dictionary. It contains all the public properties of Workflow. I read all the entries in the OutputParameters and update the input parameters Dictionary with the new values. This is required in the AddWidget function of DashboardFacade where I need to know the widget instance created by the workflow.&lt;/P&gt;
&lt;P&gt;WorkflowTerminated fires when there’s an exception. When any activity inside the workflow raises exception, this event fires and workflow execution aborts. I capture this exception and throw it again so that ASP.NET can trap this exception using its default exception handler. &lt;BR&gt;
&lt;DIV&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   1:&lt;/SPAN&gt; Exception x  = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:&lt;/SPAN&gt; EventHandler&amp;lt;WorkflowTerminatedEventArgs&amp;gt; terminatedHandler = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;            &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   3:&lt;/SPAN&gt; terminatedHandler = &lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt;(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; o, WorkflowTerminatedEventArgs e)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   5:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e.WorkflowInstance.InstanceId == instance.InstanceId)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:&lt;/SPAN&gt;   {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   7:&lt;/SPAN&gt;     workflowRuntime.WorkflowTerminated -= terminatedHandler;                    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:&lt;/SPAN&gt;     Debug.WriteLine( e.Exception );&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   9:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:&lt;/SPAN&gt;     x = e.Exception;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  11:&lt;/SPAN&gt;   }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:&lt;/SPAN&gt; };&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  13:&lt;/SPAN&gt; workflowRuntime.WorkflowCompleted += completedHandler;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:&lt;/SPAN&gt; workflowRuntime.WorkflowTerminated += terminatedHandler;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  15:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:&lt;/SPAN&gt; manualScheduler.RunWorkflow(instance.InstanceId);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  17:&lt;/SPAN&gt; &amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt; != x)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  19:&lt;/SPAN&gt;   &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; WorkflowException(x);&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;This helps me get exceptions shown in ASP.NET Exception handler like this:&lt;/P&gt;
&lt;P&gt;&lt;IMG height=325 src="http://omar.mvps.org/images/Synchronouslyexecuteandgetreturnparamete_1C3B/image01.png" width=536 mce_src="http://omar.mvps.org/images/Synchronouslyexecuteandgetreturnparamete_1C3B/image01.png"&gt; &lt;/P&gt;
&lt;P&gt;The &lt;EM&gt;WorkflowHelper&lt;/EM&gt; is a reusable class that you can use in your work project. Just copy the class file out of my project and add in your own. &lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4684786" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/omarzabir/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/omarzabir/archive/tags/WWF/default.aspx">WWF</category></item></channel></rss>