<?xml-stylesheet type="text/xsl" href="/rss.xsl" media="screen"?><rss version="2.0"><channel><title>softlogger Latest Articles ::Windows-Workflow-Foundation</title><link>http://softlogger.com</link><description>softlogger Latest Articles ::Windows-Workflow-Foundation</description><ttl>180</ttl><item><title>Asynchronous Workflow Activities:  Implemented Asynchronous WebRequests</title><link>http://softlogger.com/7250/Windows-Workflow-Foundation/asynchronous-workflow-activities--implemented-asynchronous-webrequests.aspx</link><description>
&lt;STYLE type=text/css&gt;
.style1 {
	color: black;
}
.style2 {
	margin-left: 120px;
}
&lt;/STYLE&gt;

&lt;P&gt;(note: sample code is attached to this post).&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As I stated before, &lt;A href="http://www.awprofessional.com/bookstore/product.asp?isbn=0321399838&amp;amp;rl=1" mce_href="http://www.awprofessional.com/bookstore/product.asp?isbn=0321399838&amp;amp;rl=1"&gt;Darma's excellent book&lt;/A&gt; finally gave me the a-ha moment for Windows Workflow Foundation beyond building simple Hello, World demos and making activities pretty. I finally get how to do more useful things with WF, and finally see why you should think twice before writing another program that doesn't use WF (not saying that every program requires WF, not by any stretch… but many of the programs that exist in the wild could seriously benefit from WF, enough that you should take a second look). &lt;/P&gt;
&lt;P&gt;A task that I have wondered about is how you would perform work asynchronously. For instance, you want to utilize the IAsyncResult pattern when possible for server side applications, but how would you achieve that? Turns out that Windows Workflow Foundation makes this very straightforward. To demonstrate this, I am going to pirate some code from MSDN and repurpose it into an Activity. We will pirate some of the code from the &lt;A href="http://msdn2.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx"&gt;MSDN documentation on using FtpWebRequest&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;I posted to an internal discussion list asking how to do this, and Jon &lt;A href="http://www.masteringbiztalk.com/blogs/jon/CommentView,guid,7be9fb53-0ddf-4633-b358-01c3e9999088.aspx" mce_href="http://www.masteringbiztalk.com/blogs/jon/CommentView,guid,7be9fb53-0ddf-4633-b358-01c3e9999088.aspx"&gt;Flanders pointed out that he had written a sample that used the pattern I needed to follow&lt;/A&gt;. Since I hadn't yet grokked services, queues, and the real purpose of workflow as a runtime that spans multiple process and appdomain boundaries, I looked at it, and my eyes glazed over. Once I went back and took another peek, it made perfect sense. I think this is the single most important thing to grok for Windows Workflow Foundation: the concept of long-running workflow activities. &lt;/P&gt;
&lt;P&gt;I am going to follow the same pattern Jon used, and we will pirate code from MSDN to fit within that pattern. &lt;/P&gt;
&lt;P&gt;The really cool thing about this is that you will see how to take existing code and apply it to workflow activities, gaining new capabilities for your existing code. Developers will be able to take your activities and simply drag-and-drop their way through some fairly complex processing, becoming incredibly productive while you get to focus on the really cool plumbing underneath. You get to focus on writing reusable activities that developers can use incredibly quickly in their applications, and you get to focus on the more interesting deeper code. You get all the kudos for being the rock star who saves the company money by increasing developer productivity! &lt;/P&gt;
&lt;P&gt;As with any WF Activity, we start by creating a class that will represent our Activity. Our activity will simply get an FTP file, we'll call it GetFileActivity. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Net;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.Runtime;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.Activities;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.ComponentModel;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.ComponentModel;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: blue"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Workflow.Ftp &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Courier New"&gt;{ &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;partial&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;: &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;SequenceActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; GetFileActivity() &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent(); &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;We will create two properties for our Activity, one that allows the user to specify the URI to the file being downloaded, and another property that specifies where to write the file to. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public static&lt;/SPAN&gt;&lt;SPAN class=style1&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DependencyProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; UrlProperty = &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt; &lt;SPAN style="COLOR: black"&gt;               System.Workflow.ComponentModel.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DependencyProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Register(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Url"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;), &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"The full URL to the file being requested (ie: ftp://localhost/somefolder/somefile.txt)"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Category&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Behavior"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Browsable&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DesignerSerializationVisibility&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DesignerSerializationVisibility&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Visible)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Url&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE class=style2&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; ((&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.GetValue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.UrlProperty))); }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;	set&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{ &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.SetValue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.UrlProperty, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;);}&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public static &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DependencyProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; LocalFilePathProperty = System.Workflow.ComponentModel.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DependencyProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Register(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"LocalFilePath"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;), &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"The local file path where the downloaded file will be stored"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Category&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Behavior"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Browsable&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DesignerSerializationVisibility&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DesignerSerializationVisibility&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Visible)]&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; LocalFilePath&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; &lt;SPAN style="COLOR: black"&gt;{ &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; ((&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.GetValue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.LocalFilePathProperty))); }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt; &lt;SPAN style="COLOR: black"&gt;{ &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.SetValue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.LocalFilePathProperty, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;); }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now, we need to override the Execute method of the activity and return an ActivityExecutionStatus enumeration member. Here's where the heart of the problem lies: how do we do something asynchronously within an activity? We could use an AutoResetEvent and signal when the work is completed. But WF provides a better way: we can leverage a custom workflow service that will signal our activity when it has completed its work. The activity will simply pass some work to its underlying service and tell the workflow runtime that it is not yet done with its work. The workflow runtime, then, will not complete the workflow until our activity indicates that it has completed (or is aborting for some reason). &lt;/P&gt;
&lt;P&gt;Think about how the DelayActivity would work under the covers. The DelayActivity itself doesn't block the current thread, it yields back to the workflow runtime and indicates that it has not yet completed its work. Something else, then, signals the DelayActivity that a specified time period has elapsed, and the DelayActivity completes its work. The DelayActivity leverages a TimerEventSubscription from the WorkflowRuntime, and the runtime signals the DelayActivity when it is to resume its workload. &lt;/P&gt;
&lt;P&gt;We will approach this in the same way. We will override the Execute method in our Activity and return the status of Executing to let the workflow runtime know that we are not done with all of our work yet. At the same time, we will also tell our custom service to start doing its work. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected override &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ActivityExecutionStatus&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Execute(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ActivityExecutionContext&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; executionContext)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; qservice = executionContext.GetService&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueue&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; q = qservice.GetWorkflowQueue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; q.QueueItemAvailable += &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.ContinueAt; &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; s = executionContext.GetService&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; request = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Create(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Url);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; request.Method = &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WebRequestMethods&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Ftp&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.DownloadFile;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; state = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(request,LocalFilePath,&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name,&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.WorkflowInstanceId);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; s.BeginFtp(state);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ActivityExecutionStatus&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Executing;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Some interesting bits here to pay close attention to. The first is the notion of a WorkflowQueueingService. If you are familiar with MSMQ, then this is very similar in concept. WF under the covers provides a set of queues as a means of communicating between activities, services, and the workflow host. We add a delegate handler called "ContinueAt" that will be called whenever a queue item is available in our workflow queue. We then cruft up some data for an FtpWebRequest, and create a custom type called FtpState. We'll look at this in more detail in a bit, but it is simply a data transfer object to hold a bunch of data related to performing this FTP request. We call our custom FtpService and ask it to start the process, and then we tell the workflow runtime that we are not done with all of our work yet. &lt;/P&gt;
&lt;P&gt;We mentioned the ContinueAt method. This is the "bookmark" that we use to continue processing. Our ContinueAt method is called when a workflow queue item is available. We use this to dequeue the item and do any processing. We could do something with the state, such as setting another dependency property that includes exeception data or the FTP status, that task is left to the reader as cleanup. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; ContinueAt(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; sender, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;QueueEventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; e)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ActivityExecutionContext&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; context = sender &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;as&lt;/SPAN&gt;&lt;SPAN class=style1&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ActivityExecutionContext&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; qservice = context.GetService&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;();&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueue&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; q = qservice.GetWorkflowQueue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; state = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)q.Dequeue();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; context.CloseActivity();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The workflow activity framework provides a pipeline of events for processing our activity. Since our activity may be constructed and destructed many times during this lifecycle, we cannot rely on using a constructor for initialization data. An Initialize method is provided for us to perform initialization operations, such as ensuring that our workflow queue exists. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected override void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Initialize(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IServiceProvider&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; provider)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; s = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)provider.GetService(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; == s)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;throw new &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;InvalidOperationException&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"The FtpService has not been added to the workflow"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;//TODO: Could also check for persistence service by looking for&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// WorkflowPersistenceService.&amp;nbsp; Ommitted for clarity.&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; qservice = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)provider.GetService(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (!qservice.Exists(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name))&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueue&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; q = qservice.CreateWorkflowQueue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;We can also handle the opposite case, tearing down any resources we created during the Initalize operation. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected override void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Uninitialize(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IServiceProvider&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; provider)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; qservice = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)provider.GetService(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowQueuingService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (qservice.Exists(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name))&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; qservice.DeleteWorkflowQueue(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Name);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;That's our activity in its entirety. Once you break it down, there's not much to it. But how do we actually get work done? The answer lies in the underlying service. There's not much to it, really. We just download a stream and write it to file. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.IO;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Net;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; System.Workflow.Runtime;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.Runtime.Hosting;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Workflow.Ftp&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public partial class &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; : &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowRuntimeService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; BeginFtp(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; state)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; state.Request.BeginGetResponse(FtpCallBack, state);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; FtpCallBack(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IAsyncResult&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; result)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; state = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)result.AsyncState;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebResponse&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; response = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;try&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response = (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebResponse&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)state.Request.EndGetResponse(result);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Stream&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; responseStream = response.GetResponseStream())&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FileStream&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; fileStream = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FileStream&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(state.LocalFilePath, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FileMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.OpenOrCreate))&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CopyStream(responseStream,fileStream);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.Close();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; state.StatusDescription = response.StatusDescription;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;//Tell the Activity that we are done with the download&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175); BACKGROUND-COLOR: yellow"&gt;WorkflowInstance&lt;/SPAN&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt; instance = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue; BACKGROUND-COLOR: yellow"&gt;this&lt;/SPAN&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt;.Runtime.GetWorkflow(state.WorkflowInstanceId);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; instance.EnqueueItem(state.WorkflowQueueName, state, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue; BACKGROUND-COLOR: yellow"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue; BACKGROUND-COLOR: yellow"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;SPAN style="BACKGROUND-COLOR: yellow"&gt;);&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;catch&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Exception&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; e)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; state.OperationException = e;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; CopyStream(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Stream&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; source, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Stream&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; target)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;byte&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;[] buffer = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new byte&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;[1024];&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; size = 1024;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; count = 0;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; count = source.Read(buffer, 0, size);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;while&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; (count &amp;gt; 0)&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; target.Write(buffer, 0, count);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; count = source.Read(buffer, 0, size);&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; target.Flush();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The part to pay attention to is highlighted. Our service obtains a reference to a workflow instance and then enqueues an item into the specified queue. This is how our service will notify our custom activity that the asynchronous work has completed and it can resume where it left off… at its ContinueAt method! A trap that I ran into while trying to figure this out: you might be tempted to create a new WorkflowRuntime and then call its GetWorkflow method. There is an easier way: just inherit your service from WorkflowRuntimeService, and you will have access to the WorkflowRuntime through its inherited member "Runtime". Our FtpService doesn't have to derive from WorkflowRuntimeService, but it sure makes things easier by having access to the WorkflowRuntime through the "Runtime" property. &lt;/P&gt;
&lt;P&gt;The final bit of plumbing to show is the FtpState class. Nothing much to tell about here, its just a data transfer object between the activity and the workflow service. I chose to make most of the properties read only (omitting the set accessor) because those properties should not be changed once the FTP process has started. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Threading;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Net;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Workflow.Ftp&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public class &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpState&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _request;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _url;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _localFilePath;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Exception&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; operationException = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _workflowQueueName;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _workflowInstanceId;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; status;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; FtpState(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; request,&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; localFilePath, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; workflowQueueName, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; workflowInstanceId)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _request = request;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _url = request.RequestUri;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _localFilePath = localFilePath;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _workflowQueueName = workflowQueueName;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _workflowInstanceId = workflowInstanceId;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;FtpWebRequest&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Request&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _request; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Url&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _url; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; LocalFilePath&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _localFilePath; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Exception&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; OperationException&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; operationException; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { operationException = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; StatusDescription&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; status; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { status = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; WorkflowQueueName&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _workflowQueueName; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Guid&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; WorkflowInstanceId&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; { &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; _workflowInstanceId; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;P&gt;We will now focus on our Workflow Host. Like any good demo, we will use a Console app. In the Console app, we spin up a workflow runtime and add services to the workflow, same as usual. Only this time, we will add our custom service to the runtime as well, which is highlighted. The host is pretty simple, it's pretty much the default one that Visual Studio will create for you with the addition of our custom service. We also add the SqlWorkflowPersistenceService in there as well, since that is required for our activity. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;#region&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Using directives&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Collections.Generic;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Text;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Threading;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.Runtime;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; System.Workflow.Runtime.Hosting;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Workflow.Ftp;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;#endregion&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; WorkflowConsoleApplication1&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;class &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Program&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;			&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;static &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;AutoResetEvent&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; waitHandle;&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;static void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; Main(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;[] args)&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowRuntime&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; workflowRuntime = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowRuntime&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;())&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175); BACKGROUND-COLOR: yellow"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt; s = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue; BACKGROUND-COLOR: yellow"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175); BACKGROUND-COLOR: yellow"&gt;FtpService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black; BACKGROUND-COLOR: yellow"&gt;();&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&lt;SPAN style="BACKGROUND-COLOR: yellow"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; workflowRuntime.AddService(s);&lt;/SPAN&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;SqlWorkflowPersistenceService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; ps = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;SqlWorkflowPersistenceService&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Data Source=(local);Initial Catalog=SqlPersistenceService;Integrated Security=True"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; workflowRuntime.AddService(ps);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; waitHandle = &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;AutoResetEvent&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; workflowRuntime.WorkflowCompleted += &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;EventHandler&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowCompletedEventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;gt;(workflowRuntime_WorkflowCompleted);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; workflowRuntime.WorkflowTerminated += &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;delegate&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; sender, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowTerminatedEventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; e)&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Console&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.WriteLine(e.Exception.Message);&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; waitHandle.Set();&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowInstance&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; instance = workflowRuntime.CreateWorkflow(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(WorkflowConsoleApplication1.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Workflow1&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;));&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; instance.Start();&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; waitHandle.WaitOne();&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P style="BACKGROUND: white 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;static void&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; workflowRuntime_WorkflowCompleted(&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;object&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; sender, &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;WorkflowCompletedEventArgs&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt; e)&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; waitHandle.Set();&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: black"&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Now that we completed the activity, the service, the asynchronous state object, and our workflow host, let's see how we can use the activity from a workflow. Here's the XOML for the workflow. Pretty uninteresting, other than it completes the story. &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SequentialWorkflowActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;x:Class&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;WorkflowConsoleApplication1.Workflow2&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;x:Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Workflow2&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:ns0&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;clr-namespace:Workflow.Ftp;Assembly=Workflow.Ftp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:x&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;A href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;&lt;SPAN style="COLOR: blue"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;http://schemas.microsoft.com/winfx/2006/xaml/workflow&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;ns0:GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;x:Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;Activity1&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;LocalFilePath&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;c:\temp\testing.txt&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;ns0:GetFileActivity.Url&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;ns1:Uri&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;BR&gt;	&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;xmlns:ns1&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;clr-namespace:System;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;ns0:GetFileActivity.Url&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp; &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;ns0:GetFileActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SequentialWorkflowActivity&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;BR&gt;				&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;One caveat: now that I completed this and typed out this ultra-long blog post, I found out that the Workflow designer doesn't like having the System.Uri property, tossing an error "CreateInstance failed for type 'System.Uri'. No parameterless constructor defined for this object." You could rectify this by changing the Url property of the activity back to a string and then parsing it with the System.Uri type to ensure that the scheme is FTP. Even though the designer doesn't like it, the workflow still runs like a champ. &lt;/P&gt;
&lt;P&gt;This may look like a bit of code, but there really isn't much to it. Here's a summary of what you can do to process asynchronous operations using a custom workflow activity: &lt;/P&gt;
&lt;DIV&gt;
&lt;TABLE class=" " style="BORDER-COLLAPSE: collapse" border=0&gt;
&lt;COLGROUP&gt;
&lt;COL style="WIDTH: 319px"&gt;
&lt;COL style="WIDTH: 319px"&gt;&lt;/COLGROUP&gt;
&lt;TBODY vAlign=top&gt;
&lt;TR&gt;
&lt;TD class=" " style="BORDER-RIGHT: black 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: black 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: black 0.5pt solid; BORDER-BOTTOM: black 0.5pt solid"&gt;
&lt;P&gt;Create a custom activity&lt;/P&gt;&lt;/TD&gt;
&lt;TD class=" " style="BORDER-RIGHT: black 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: black 0.5pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: black 0.5pt solid"&gt;
&lt;OL&gt;
&lt;LI&gt;Override the Execute method and return ActivityExecutionStatus.Executing. &lt;/LI&gt;
&lt;LI&gt;Specify a "ContinueAt" method that will execute when a queue message is received.&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=" " style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: 0.5pt solid; BORDER-BOTTOM: 0.5pt solid"&gt;
&lt;P&gt;Create a custom service&lt;/P&gt;&lt;/TD&gt;
&lt;TD class=" " style="BORDER-RIGHT: 0.5pt solid; PADDING-RIGHT: 7px; BORDER-TOP: medium none; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 0.5pt solid"&gt;
&lt;OL&gt;
&lt;LI&gt;Process the work asynchronously &lt;/LI&gt;
&lt;LI&gt;Enqueue a message when the work is completed&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;This has a lot of applications going forward. For instance, the InvokeWebServiceActivity that ships as part of Windows Workflow Foundation invokes web services synchronously. If the web services are being invoked from ASP.NET pages, then &lt;A href="http://blogs.msdn.com/kaevans/archive/2006/03/04/543848.aspx" mce_href="http://blogs.msdn.com/kaevans/archive/2006/03/04/543848.aspx"&gt;you want to perform that work asynchronously&lt;/A&gt;, and the way to achieve that would be to use this pattern. Maybe that's the next article… calling a web service asynchronously. Maybe a few less lines of code, but the pattern will be basically the same. &lt;/P&gt;
&lt;P&gt;The sample code is available as a download, attached to this blog post.&amp;nbsp; I welcome feedback, please feel free to leave comments!&lt;/P&gt;
&lt;P&gt;Hmm… I wonder… maybe there's a pattern here for generalized activities that support the IAsyncResult pattern? &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3650800" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7250"&gt;</description><author>Kirk Allen Evans Blog</author><pubDate>2007-07-02T00:00:00</pubDate><category>Windows Workflow Foundation</category></item><item><title>SYSK 352: Windows Workflow Foundation Runtime Footprint</title><link>http://softlogger.com/7234/Windows-Workflow-Foundation/sysk-352-windows-workflow-foundation-runtime-footprint.aspx</link><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;After seeing presentations that assert that “Workflow runtime is lightweight” and not finding any concrete numbers to support that claim I decided to do some of my own profiling.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;Here is what I’ve done, measuring memory utilization after every step (the displayed results are the difference, in bytes, of current memory consumption minus one at the previous check point):&lt;/FONT&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Create a simple Windows app -- one form with a couple of buttons on it.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Get the baseline memory utilization&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Instantiate workflow runtime using early binding&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;System.Workflow.Runtime.&lt;SPAN style="COLOR: #2b91af"&gt;WorkflowRuntime&lt;/SPAN&gt; wr = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; System.Workflow.Runtime.&lt;SPAN style="COLOR: #2b91af"&gt;WorkflowRuntime&lt;/SPAN&gt;();&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=4&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Start runtime:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;wr.StartRuntime();&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=5&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Create a basic (nothing except for the initial state) state machine workflow:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;wr.CreateWorkflow(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(RulesAndWorkflows.&lt;SPAN style="COLOR: #2b91af"&gt;Workflow1&lt;/SPAN&gt;));&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=6&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;&lt;FONT face=Verdana&gt;Stop runtime and dispose the object:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;wr.StopRuntime();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;wr.Dispose();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;wr = &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Here are the early-binding results&lt;/B&gt; (in release mode):&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l4 level1 lfo4"&gt;&lt;FONT face=Verdana&gt;Baseline private bytes: 18,194,432&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l4 level1 lfo4"&gt;&lt;FONT face=Verdana&gt;Instantiate runtime: 1,232,896&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l4 level1 lfo4"&gt;&lt;FONT face=Verdana&gt;Start runtime: 1,724,416&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l4 level1 lfo4"&gt;&lt;FONT face=Verdana&gt;Creating empty workflow (loads Activities and ComponentModel assemblies): 2,203,648&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l4 level1 lfo4"&gt;&lt;FONT face=Verdana&gt;Stop runtime, but do not unload assemblies: 0&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;U&gt;Note&lt;/U&gt;: running same code again results in no additional memory consumption:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo2"&gt;&lt;FONT face=Verdana&gt;Instantiate runtime: 0&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo2"&gt;&lt;FONT face=Verdana&gt;Start runtime: 0&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo2"&gt;&lt;FONT face=Verdana&gt;Creating empty workflow (loads Activities and ComponentModel assemblies): 0&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo2"&gt;&lt;FONT face=Verdana&gt;Stop runtime, but do not unload assemblies: 0&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;In the second type of test I wanted to profile the memory utilization when loading assemblies “manually”, i.e. using late binding:&lt;/FONT&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo3"&gt;&lt;FONT face=Verdana&gt;Using the same application, get the baseline memory utilization&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo3"&gt;&lt;FONT face=Verdana&gt;Instantiate runtime:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;AppDomain&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;.CurrentDomain.CreateInstanceAndUnwrap(&lt;SPAN style="COLOR: #a31515"&gt;"System.Workflow.Runtime"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;"System.Workflow.Runtime.WorkflowRuntime"&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=3&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo3"&gt;&lt;FONT face=Verdana&gt;Load System.Workflow.ComponentModel assembly:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;AppDomain&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;.CurrentDomain.Load(&lt;SPAN style="COLOR: #a31515"&gt;"System.Workflow.ComponentModel"&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=4&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo3"&gt;&lt;FONT face=Verdana&gt;Load System.Workflow.Activities assembly:&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 1in"&gt;&lt;SPAN style="COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;AppDomain&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-no-proof: yes"&gt;.CurrentDomain.Load(&lt;SPAN style="COLOR: #a31515"&gt;"System.Workflow.Activities"&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Below are the late-binding results&lt;/B&gt; (in release mode, without workflow creation):&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo5"&gt;&lt;FONT face=Verdana&gt;Baseline private bytes: 14,028,800&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo5"&gt;&lt;FONT face=Verdana&gt;Late-bound runtime instantiation: 4,689,920&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo5"&gt;&lt;FONT face=Verdana&gt;Load System.Workflow.ComponentModel assembly: 204,800&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo5"&gt;&lt;FONT face=Verdana&gt;Load System.Workflow.Activities assembly: 708,608&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana&gt;Now, armed with data, you can draw your own conclusions about the WF footprint.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Of course, keep in mind, that the “real-life” applications will have significantly larger baseline memory utilization than my primitive sample did…&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3549601" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7234"&gt;</description><author>AppDev: Something You Should Know by Irena Kennedy</author><pubDate>2007-06-26T00:00:00</pubDate><category>Windows Workflow Foundation</category></item><item><title>Unit Testing Activity CodeDOM Serializers</title><link>http://softlogger.com/6978/Windows-Workflow-Foundation/unit-testing-activity-codedom-serializers.aspx</link><description>&lt;P&gt;Windows Workflow Foundation (WF) defines workflows as object graphs. To save or compile workflow definitions, these object graphs must be serialized, and WF supports serialization to both XAML and code. Similar to&amp;nbsp;other&amp;nbsp;components, WF utilizes the .NET design-time framework for serialization and deserialization of objects. Serializing objects to code is done using CodeDomSerializer-derived classes.&lt;/P&gt;
&lt;P&gt;In WF, the base CodeDOM serializer is ActivityCodeDomSerializer, and if you want to unit test your custom CodeDOM serializer for a custom activity, you can use the general approach I have &lt;A class=" " href="http://blogs.msdn.com/ploeh/archive/2006/02/16/TowardsUnitTestingComponentSerializers.aspx" mce_href="http://blogs.msdn.com/ploeh/archive/2006/02/16/TowardsUnitTestingComponentSerializers.aspx"&gt;earlier described&lt;/A&gt;. As it turns out, unit testing WF Activity CodeDOM serializers is simpler than unit testing components in general, since the base WF classes are already doing some of the work for you. You will still need to implement a designer loader for testing purposes, but you don't need to mess with a fake implementation of ITypeResolutionService.&lt;/P&gt;
&lt;P&gt;Let's say that I wish to unit test my custom serialization logic for this activity and its corresponding serializer:&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#000000&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;DesignerSerializer&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;MyActivityCodeDomSerializer&lt;/SPAN&gt;),&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;CodeDomSerializer&lt;/SPAN&gt;))]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyActivity&lt;/SPAN&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;Activity&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Implementation goes here&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyActivityCodeDomSerializer&lt;/SPAN&gt; : &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;ActivityCodeDomSerializer&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Implementation goes here&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;As you can tell, I've omitted the implementations of both Activity and serializer, since these&amp;nbsp;are not important for this example. Just like the &lt;A class=" " href="http://blogs.msdn.com/ploeh/archive/2006/02/16/TowardsUnitTestingComponentSerializers.aspx" mce_href="http://blogs.msdn.com/ploeh/archive/2006/02/16/TowardsUnitTestingComponentSerializers.aspx"&gt;general case&lt;/A&gt;, the first thing to do is to create a designer loader that only exists for unit testing purposes. However, instead of deriving from CodeDomDesignerLoader, this class should derive from WorkflowDesignerLoader:&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#000000&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;internal&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;FakeCodeDomDesignerLoader&lt;/SPAN&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;WorkflowDesignerLoader&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; FileName&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #a31515"&gt;"Fake"&lt;/SPAN&gt;; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;TextReader&lt;/SPAN&gt; GetFileReader(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; filePath)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotImplementedException&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;TextWriter&lt;/SPAN&gt; GetFileWriter(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; filePath)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;NotImplementedException&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;WorkflowDesignerLoader is an abstract class, so it's necessary to override its abstract members, but as you can tell, I haven't done much in that regard. In this case, GetFileReader and GetFileWriter is never called, and although FileName is invoked, the return value is not used for anything that affects the unit test, so I'm just returning a hard-coded string.&lt;/P&gt;
&lt;P&gt;When you call BeginLoad on a DesignSurface with this loader (which I'll do in the unit test), PerformLoad will be called, so I have overridden this method to define a default root component:&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#000000&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; PerformLoad(&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IDesignerSerializationManager&lt;/SPAN&gt; serializationManager)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;.PerformLoad(serializationManager);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;CompositeActivity&lt;/SPAN&gt; rootActivity = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;SequenceActivity&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.AddActivityToDesigner(rootActivity);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;In this case, the root component will always be a SequenceActivity; this corresponds to opening a new sequential workflow in the Visual Studio designer. You can now add other Activities to the root sequential workflow from the unit test, as I will demonstrate later.&lt;/P&gt;
&lt;P&gt;To retrieve the serialized code, the designer loader must be flushed. While flushing, PerformFlush is called, so I override this method to capture the serialized code and save it in a private field:&lt;/P&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#000000&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;CodeStatementCollection&lt;/SPAN&gt; codeStatements_;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; PerformFlush(&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IDesignerSerializationManager&lt;/SPAN&gt; serializationManager)&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;.PerformFlush(serializationManager);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;ActivityCodeDomSerializer&lt;/SPAN&gt; serializer = &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;ActivityCodeDomSerializer&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.codeStatements_ = &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;SPAN style="COLOR: #2b91af"&gt;CodeStatementCollection&lt;/SPAN&gt;)serializer.Serialize(&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serializationManager, &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.LoaderHost.RootComponent);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;To retrieve the serialized code from a unit test, I implement a simple method that returns the code statements (recall that calling Flush causes PerformFlush to be called):&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;internal&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;CodeStatementCollection&lt;/SPAN&gt; GetCodeStatements()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.Flush();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.codeStatements_;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;With FakeCodeDomDesignerLoader in place, it's now fairly straightforward to write a unit test that exercises the custom serializer that's associated with MyActivity:&lt;/P&gt;
&lt;DIV style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;PRE style="MARGIN: 0px"&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;TestMethod&lt;/SPAN&gt;]&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; MyTestCase()&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;{&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;FakeCodeDomDesignerLoader&lt;/SPAN&gt; loader = &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;FakeCodeDomDesignerLoader&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;DesignSurface&lt;/SPAN&gt; surface = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;DesignSurface&lt;/SPAN&gt;();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; surface.BeginLoad(loader);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;IDesignerHost&lt;/SPAN&gt; host =&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;SPAN style="COLOR: #2b91af"&gt;IDesignerHost&lt;/SPAN&gt;)surface.GetService(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;IDesignerHost&lt;/SPAN&gt;));&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;MyActivity&lt;/SPAN&gt; ma = &lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;SPAN style="COLOR: #2b91af"&gt;MyActivity&lt;/SPAN&gt;)host.CreateComponent(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;MyActivity&lt;/SPAN&gt;),&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #a31515"&gt;"ma"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;SPAN style="COLOR: #2b91af"&gt;SequenceActivity&lt;/SPAN&gt;)host.RootComponent).Activities.Add(ma);&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #2b91af"&gt;CodeStatementCollection&lt;/SPAN&gt; codeStatements =&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; loader.GetCodeStatements();&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Perform validation of code statements&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN: 0px"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;As with the general approach, the first thing to do is to create an instance of the designer loader. Then I create a new DesignSurface which is going to host the SequenceActivity root component that I can then add an instance of MyActivity to. Calling BeginLoad on the DesignSurface caused PerformLoad to be called on the FakeCodeDomDesignerLoader instance, which then creates the SequenceActivity and adds it as the root component.&lt;/P&gt;
&lt;P&gt;The next step is to retrieve an instance of IDesignerHost, which can then be used to create an instance of MyActivity. Creating MyActivity instances this way ensures that any designers, editors and serializers (in this case, MyActivityCodeDomSerializer) is loaded and initialized correctly.&lt;/P&gt;
&lt;P&gt;The newly created MyActivity instance is then added to the root component, i.e. the sequential workflow.&lt;/P&gt;
&lt;P&gt;Getting the serialized code statements is then as simple as calling GetCodeStatements. This returns a CodeStatementCollection instance, and you can then use the principles outlined in my &lt;A class=" " href="http://blogs.msdn.com/ploeh/archive/2007/04/01/ValidatingCodeSerializedByCodeDomDesignerLoaders.aspx" mce_href="http://blogs.msdn.com/ploeh/archive/2007/04/01/ValidatingCodeSerializedByCodeDomDesignerLoaders.aspx"&gt;former article&lt;/A&gt; to validate that your custom serializer created the expected code statements.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2030759" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=6978"&gt;</description><author>ploeh blog</author><pubDate>2007-04-05T00:00:00</pubDate><category>Windows Workflow Foundation</category></item><item><title>Windows Workflow 103 or WF Part 3 - Introduction to Workflow</title><link>http://softlogger.com/6752/Windows-Workflow-Foundation/windows-workflow-103-or-wf-part-3--introduction-to-workflow.aspx</link><description>&lt;p&gt;In&amp;nbsp;the last two posts &lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2007/02/24/Windows-Workflow-101-or-2-Months-with-WF.aspx"&gt;101&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2007/03/09/Windows-Workflow-102-or-WF-Part-2.aspx"&gt;102&lt;/a&gt;,&amp;nbsp;I went pretty deep in some areas. I want to step back and do some more tutorial stuff. So the first question out of the gate is what is Workflow itself and where might you use it? In a nutshell, a Workflow describes and automates a Business Process. It can be described as a &amp;quot;reactive&amp;quot; program which tends to contain some traits:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Workflow declared as a set of Activities&lt;/li&gt;&lt;li&gt;Coordinates people and software&lt;/li&gt;&lt;li&gt;Has real-world control flow&lt;/li&gt;&lt;li&gt;Runs reliably and durably&lt;/li&gt;&lt;li&gt;Tolerates dynamic change&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;A Workflow is typically designed by a Process Designer using Business Process Analysis, Modeling, and Definition tools. That Process Definition is fed into a Workflow Management System. The WMS will have Users, Applications and Administrators/Supervisors. The WMS will present that Process Definition visually in some form and launch applications. &lt;/p&gt;&lt;p&gt;From looking at workflows, we see that some challenges are present. Unlike non-reactive programs, workflows tend to be long-running and stateful. It may take 20 days for an order to be shipped for instance. There usually needs to be some controls to allow a person to override or skip a step in the workflow. Finally, we must be able to see into the workflow and see what state its in and visualizing control flow. Workflow is used in many scenarios like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Business Process Management (BPM)&lt;/li&gt;&lt;li&gt;Document Lifecycle Management (Sharepoint, K2)&lt;/li&gt;&lt;li&gt;BizTalk Orchestration&lt;/li&gt;&lt;li&gt;Sales Management &lt;/li&gt;&lt;li&gt;Line of Business Apps&lt;/li&gt;&lt;li&gt;Many others...&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Enter Windows Workflow (WF). Unlike K2 and Sharepoint, WF is &lt;strong&gt;not&lt;/strong&gt; a Workflow Management system or product. It is instead, a general purpose framework for building workflow into your own applications. It ships as part of the .NET Framework 3.0, and ships with both Vista and Longhorn Server. It is installable on Windows XP SP2 and Win2K3. Since WF is baked into Vista and later systems, and is a general framework, it is a single workflow execution engine for all Windows platforms. Indeed, products like K2, Sharepoint, BizTalk, and may others have been changed to be built on WF. The are a lot of extensibility points in WF so you can build it into your app but the point bears repeating: it&amp;#39;s not a workflow management product and &lt;strong&gt;thus you are responsible for hosting it&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Now, time for some WF concepts. Workflows are a Set of Activities. Workflows (or more properly workflow instances) run inside a host process, which can be any AppDomain, from a console app to a Windows Service and anything in-between. Developers are encouraged to build their own Custom Activities. WF itself, comes with an extensive set of Activities in its Base Activity Library. WF also has a Runtime Engine that executes workflows and handles state management. WF also allows an extensible set of activities to be added for things like Persistence, Tracking, and Communication. The model is quite flexible, as except for certain minimal services that must have a default implementation, it&amp;#39;s an opt-in model and you only add services you need, keeping the WF Runtime light. Finally, WF has a Visual Designer that manifests in Visual Studio, but since its a general framework, you can create your own domain-specific designer as I am doing for Collateral Management. &lt;/p&gt;&lt;p&gt;There are two main kinds of workflows in WF: Sequential and State Machine. Sequential workflows are like flowcharts and are structured, step-by-step (maybe that&amp;#39;s why they&amp;#39;re called sequential!) but can and usually do contain branching. They are good for automation scenarios. Meanwhile, State machine workflows are reactive and event-driven. They transition from state to state based on events, usually triggered externally. &lt;/p&gt;&lt;p&gt;A Workflow in WF is an instance of a class but also can be represented in XAML. There are several Workflow Authoring Modes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Markup-Only (Declarative)&lt;/li&gt;&lt;li&gt;Markup and Code&lt;/li&gt;&lt;li&gt;Code Only&lt;/li&gt;&lt;li&gt;Application-Generated&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I am going to leave a discussion of authoring modes until later. Now, looking again at Activities, they have been called &amp;quot;resumable program statements.&amp;quot; They are the building blocks of a workflow, as the basic Activities are the basic steps in a workflow. A Composite Activity is an Activity that contains other Activities. Since an Activity is a class, you build one as follows:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Derive from an existing Activity or from the base Activity class&lt;/li&gt;&lt;li&gt;Override Execute()&lt;/li&gt;&lt;li&gt;Add Properties/Dependency Properties&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I talked about Hosting the WF Runtime in Part &lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2007/02/24/Windows-Workflow-101-or-2-Months-with-WF.aspx"&gt;101&lt;/a&gt;. Again, its a lightweight execution environment for workflows or as they are called &amp;quot;WF Programs.&amp;quot; To be lightweight and allow ultimate flexibility, it must be hosted in an AppDomain, which can be a console app, Windows Service, Web Service, ASP.NET, Avalon app, etc. And again, the services are pluggable. Hosting&amp;nbsp;and running a workflow is fairly simple:&lt;/p&gt;&lt;p&gt;&lt;textarea class="c#:nogutter" cols="71" name="code" rows="10" style="width:602px;height:164px;"&gt;using(WorkflowRuntime workflowRuntime = new  WorkflowRuntime()) {

   // Factory method
   WorkflowInstance instance =  workflowRuntime.CreateWorkflow(typeof   (FirstWorkflow.SayHello));
  instance.Start();

  // do your stuff here

  }
} 
&lt;/textarea&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;I am going to leave off there for now. Next part, I will dive deeper into hosting the runtime and services. Please do drop a note on how this article is - is it helpful?&lt;/p&gt;&lt;p&gt;&lt;span class="technoratitag"&gt;&lt;b&gt;Technorati Tags:&lt;/b&gt; &lt;a href="http://www.technorati.com/tag/.NET" rel="tag"&gt;.NET&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Windows%20Communication%20Foundation" rel="tag"&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Financial%20and%20Banking" rel="tag"&gt;Financial and Banking&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Collateral%20Management" rel="tag"&gt;Collateral Management&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/WCF" rel="tag"&gt;WCF&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/WF" rel="tag"&gt;WF&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Windows%20Workflow" rel="tag"&gt;Windows Workflow&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Workflow" rel="tag"&gt;Workflow&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Software%20Architecture" rel="tag"&gt;Software Architecture&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Microsoft" rel="tag"&gt;Microsoft&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a title="Email Windows Workflow 103 or WF Part 3 - Introduction to Workflow" href = "mailto:?body=Thought%20you%20might%20like%20this:%20http://codebetter.com/blogs/sam.gentile/archive/2007/03/09/Windows-Workflow-103-or-WF-Part-3-_2D00_-Introduction-to-Workflow.aspx&amp;amp;subject=Windows+Workflow+103+or+WF+Part+3+-+Introduction+to+Workflow"&gt;Email it!&lt;/a&gt; | &lt;a href = "http://del.icio.us/post?url=http://codebetter.com/blogs/sam.gentile/archive/2007/03/09/Windows-Workflow-103-or-WF-Part-3-_2D00_-Introduction-to-Workflow.aspx&amp;amp;title=Windows+Workflow+103+or+WF+Part+3+-+Introduction+to+Workflow" title="Submit Windows Workflow 103 or WF Part 3 - Introduction to Workflow to del.icio.us" &gt;bookmark it!&lt;/a&gt; | &lt;a href = "http://www.digg.com/submit?url=http://codebetter.com/blogs/sam.gentile/archive/2007/03/09/Windows-Workflow-103-or-WF-Part-3-_2D00_-Introduction-to-Workflow.aspx&amp;amp;phase=2" title="Submit Windows Workflow 103 or WF Part 3 - Introduction to Workflow to digg.com"&gt;digg it!&lt;/a&gt; | &lt;a href = "http://reddit.com/submit?url=http://codebetter.com/blogs/sam.gentile/archive/2007/03/09/Windows-Workflow-103-or-WF-Part-3-_2D00_-Introduction-to-Workflow.aspx&amp;amp;title=Windows+Workflow+103+or+WF+Part+3+-+Introduction+to+Workflow" title="Submit Windows Workflow 103 or WF Part 3 - Introduction to Workflow to reddit.com"&gt;reddit!&lt;/a&gt;| &lt;a href = "http://www.dotnetkicks.com/kick/?url=http://codebetter.