<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Peter Ritchie's MVP Blog : C# 5</title><link>http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+5/default.aspx</link><description>Tags: C# 5</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>async/await Tips</title><link>http://msmvps.com/blogs/peterritchie/archive/2013/02/13/async-await-gotchas.aspx</link><pubDate>Wed, 13 Feb 2013 18:02:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1823771</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1823771</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2013/02/13/async-await-gotchas.aspx#comments</comments><description>&lt;p&gt;There’s been some really good guidance about &lt;font face="Courier New"&gt;async&lt;/font&gt;/&lt;font face="Courier New"&gt;await&lt;/font&gt; in the past week or two.&amp;#160; I’ve been tinkering away at this post for a while now—based on presentations I’ve been doing, discussions I’ve had with folks at Microsoft, etc.&amp;#160; Now seems like a good idea to post it.&lt;/p&gt;  &lt;p&gt;First, it’s important to understand what the &amp;quot;async&amp;quot; keyword really mean.&amp;#160; At face value &lt;font face="Courier New"&gt;async&lt;/font&gt; doesn’t make a method (anonymous or member) “asynchronous”—the body of the method does that.&amp;#160; What it does mean is that there’s a strong possibility that the body of the method won’t entirely be evaluated when the method returns to the caller.&amp;#160; i.e. it “might” be asynchronous.&amp;#160; What the compiler does is create a state machine that manages the various “awaits” that occur within an &lt;font face="Courier New"&gt;async&lt;/font&gt; method to manage the results and invoking continuations when results &lt;em&gt;are&lt;/em&gt; available.&amp;#160; I’m not going to get into too much detail about the state machine, other than to say the entry to the method is now the creation of that state machine and the initialization of moving from state to state (much like the creation of an enumerable and moving from one element—the state—to the next).&amp;#160; The important part to remember here is that when an &lt;font face="Courier New"&gt;async&lt;/font&gt; method returns, there can be some code that will be evaluated in the future.&lt;/p&gt;  &lt;p&gt;If you’ve ever done any work with &lt;font face="Courier New"&gt;HttpWebRequest&lt;/font&gt; and working with responses (e.g. disposal), you’ll appreciate being able to do this:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006272.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;h2&gt;Parallelism&lt;/h2&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;await&lt;/font&gt; is great to declare asynchronous operations in a sequential way.&amp;#160; This allows you to use other sequential syntax like using and &lt;font face="Courier New"&gt;try&lt;/font&gt;/&lt;font face="Courier New"&gt;catch&lt;/font&gt; to deal with common .NET axioms in the axiomatic way.&amp;#160; &lt;font face="Courier New"&gt;await&lt;/font&gt;, in my opinion, is really about allowing user interfaces to support asynchronous operations in an easy way with intuitive code. But, you can also use &lt;font face="Courier New"&gt;await&lt;/font&gt; to wait for parallel operations to complete.&amp;#160; For example, on a two core computer I can start up two tasks in parallel then &lt;font face="Courier New"&gt;await&lt;/font&gt; on both of them (one at a time) to complete:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006034.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;If you run this code you should see the elapsed values (on a two or more core/cpu computer) will be very similar (not 1 second apart).&amp;#160; Contrast the subtle differences to:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006097.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;While you &lt;strong&gt;can&lt;/strong&gt; use await with parallel operations, the subtlety in the differences between sequential asynchronous operations can lead to incorrect code due to misunderstandings.&amp;#160; I suggest paying close attention to how you structure your code so it is in fact doing what you expect it to do.&amp;#160; In most cases, I simply recommend not doing anything “parallel” with &lt;font face="Courier New"&gt;await&lt;/font&gt;.&lt;/p&gt;  &lt;h2&gt;async void&lt;/h2&gt;  &lt;p&gt;The overwhelming &lt;a href="http://bit.ly/157pMEb"&gt;recommendation&lt;/a&gt; is to&lt;strong&gt; avoid async methods that return void&lt;/strong&gt;.&amp;#160; Caveat: the reason async void was made possible by the language teams was the fact that most event handlers return void; but it is sometimes useful for an event handler to be asynchronous (e.g. await another asynchronous method).&amp;#160; If you want to have a method that uses await but doesn’t return anything (e.g. would otherwise be void) you can simply change the void to Task.&amp;#160; e.g.:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006967.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;This tells the compiler that the method doesn’t asynchronously return a value, but can now be awaited:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006983.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;h2&gt;Main&lt;/h2&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Main&lt;/font&gt; can&amp;#39;t be &lt;font face="Courier New"&gt;async&lt;/font&gt;. As we described above an &lt;font face="Courier New"&gt;async&lt;/font&gt; method can return with code that will be evaluated in the future Main returns, the application exits. If you *could* have an &lt;font face="Courier New"&gt;async&lt;/font&gt; &lt;font face="Courier New"&gt;Main&lt;/font&gt;, it would be similar to doing this:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/09bd71ecaa6e9454b57c.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;This, depending on the platform, the hardware, and the current load, would mean that the &lt;font face="Courier New"&gt;Console.WriteLine&lt;/font&gt; *might* get executed.&lt;/p&gt;  &lt;p&gt;Fortunately, this is easily fixed by creating a new method (that &lt;em&gt;can&lt;/em&gt; be modified with &lt;font face="Courier New"&gt;async&lt;/font&gt;) then call it from &lt;font face="Courier New"&gt;Main&lt;/font&gt;.&lt;/p&gt;  &lt;h2&gt;Exceptions&lt;/h2&gt;  &lt;p&gt;One of the biggest advantages of &lt;font face="Courier New"&gt;async&lt;/font&gt;/&lt;font face="Courier New"&gt;await&lt;/font&gt; is the ability to write sequential code with multiple asynchronous operations.&amp;#160; Previously this required methods for each continuation (actual methods prior to .NET 2.0 and anonymous methods and lambdas in .NET 2.0 and&amp;#160; .NET 3.5).&amp;#160; Having code span multiple methods (whether they be anonymous or not) meant we couldn’t use axiomatic patterns like &lt;font face="Courier New"&gt;try&lt;/font&gt;/&lt;font face="Courier New"&gt;catch&lt;/font&gt; (not to mention &lt;font face="Courier New"&gt;using&lt;/font&gt;) very effectively—we’d have to check for exceptions in multiple places for the same reason.&lt;/p&gt;  &lt;p&gt;There are some subtle ways exceptions can flow back from &lt;font face="Courier New"&gt;async&lt;/font&gt; methods, but fortunately the sequential nature of programming with await, you may not care.&amp;#160; But, with most things, it&amp;#39; depends.&amp;#160; Most of the time exceptions are caught in the continuation.&amp;#160; This usually means on a thread different from the main (UI) thread.&amp;#160; So, you have to be careful what you do when you process the exception.&amp;#160; For example, given the following two methods.&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5007599.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;And if we wrapped calls to each in &lt;font face="Courier New"&gt;try&lt;/font&gt;/&lt;font face="Courier New"&gt;catch&lt;/font&gt;:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5007623.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5007638.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;In the first case (calling &lt;font face="Courier New"&gt;DoSomething1&lt;/font&gt;) the exception is caught on the same thread that called Start (i.e. before the &lt;font face="Courier New"&gt;await&lt;/font&gt; occurred).&amp;#160; *But*, in the second case (calling &lt;font face="Courier New"&gt;DoSomething2&lt;/font&gt;) the exception is not caught on the same thread as the caller.&amp;#160; So, if you wanted to present information via the UI then you’d have to check to see if you’re on the right thread to display information on the UI (i.e. marshal back to the UI thread, if needed).&lt;/p&gt;  &lt;p&gt;Of course, any method can throw exceptions in the any of the places of the above two methods, so if you need to do something with thread affinity (like work with the UI) you’ll have to check to see if you need to marshal back to the UI thread (&lt;font face="Courier New"&gt;Control.BeginInvoke&lt;/font&gt; or &lt;font face="Courier New"&gt;Dispatcher.Invoke&lt;/font&gt;).&lt;/p&gt;  &lt;h2&gt;Unit testing&lt;/h2&gt;  &lt;p&gt;Unit testing asynchronous code can get a bit hairy.&amp;#160; For the most part, &lt;em&gt;testing&lt;/em&gt; asynchronously is really just testing the compiler and runtime—not something that is recommended (i.e. it doesn’t buy you anything, it’s not your code).&amp;#160; So, for the most part, I recommend people test the &lt;strong&gt;units&lt;/strong&gt; they intend to test.&amp;#160; e.g. test synchronous code.&amp;#160; For example, I could write an asynchronous method that calculates Pi as follows:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006827.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;…which is fairly typical.&amp;#160; Asynchronous code is often the act of running something on a background thread/task.&amp;#160; I *could* then write a test for this that executes code like this:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006844.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;But, what I really want to test is that Pi is calculated correctly, not that it occurred asynchronously. &lt;em&gt;&lt;/em&gt;In certain circumstances something may *not* executed asynchronously anyway.&amp;#160; So, I generally recommend in cases like this the test actually be:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006859.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;Of course, that may not always be possible.&amp;#160; You may only have an asynchronous way of invoking code, and if you can’t decompose into asynchronous and synchronous parts for testability then using await is likely the easiest option.&amp;#160; But, there’s some things to watch out for.&amp;#160; When writing a test for this asynchronous method you might intuitively write something like this:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006904.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;But, the problem with this method is that the Assert may not occur before the test runner exits.&amp;#160; This method doesn’t tell the runner that it should wait for a result.&amp;#160; It’s effectively &lt;font face="Courier New"&gt;async void&lt;/font&gt; (another area not to use it).&amp;#160; This can easily be fixed by changing the return from &lt;font face="Courier New"&gt;void&lt;/font&gt; to &lt;font face="Courier New"&gt;Task&lt;/font&gt;:&lt;/p&gt;  &lt;p&gt;&lt;script src="https://gist.github.com/peteraritchie/5006931.js"&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;A *very* subtle change; but this lets the runner know that the test method is “awaitable” and that it should wait for the &lt;font face="Courier New"&gt;Task&lt;/font&gt; to complete before exiting the runner.&amp;#160; &lt;a href="http://www.srtsolutions.com/testing-async-methods-in-c-5"&gt;Apparently&lt;/a&gt; many test runners recognize this and act accordingly so that your tests will actually run and your asynchronous code will be tested.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://msmvps.com/blogs/peterritchie/archive/2013/02/13/async-await-gotchas.aspx" scrolling="no" frameborder="0" style="border:none;width:325px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt; &lt;script type="text/javascript"&gt;
  (function() {
    var po = document.createElement(&amp;#39;script&amp;#39;); po.type = &amp;#39;text/javascript&amp;#39;; po.async = true;
    po.src = &amp;#39;https://apis.google.com/js/plusone.js&amp;#39;;
    var s = document.getElementsByTagName(&amp;#39;script&amp;#39;)[0]; s.parentNode.insertBefore(po, s);
  })();
&lt;/script&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1823771" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+5/default.aspx">C# 5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/async/default.aspx">async</category></item><item><title>Testing Strategies Involving Async Functions</title><link>http://msmvps.com/blogs/peterritchie/archive/2010/11/04/testing-strategies-involving-async-functions.aspx</link><pubDate>Thu, 04 Nov 2010 16:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1781600</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1781600</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2010/11/04/testing-strategies-involving-async-functions.aspx#comments</comments><description>&lt;p&gt;Some things to keep in mind when writing units tests for code that use 
async methods: You&amp;#39;re not trying to test the framework&amp;#39;s &amp;quot;awaitability&amp;quot; 
and you&amp;#39;re not trying to test framework methods that are &amp;quot;awaitable&amp;quot;.&amp;nbsp; 
You want to test your code in certain isolation contexts.&amp;nbsp; One context, 
of course, is independent of asynchronicity--do individual units of code
 that don&amp;#39;t depend on asynchronous invocation &amp;quot;work&amp;quot;...&amp;nbsp; e.g. 
&amp;quot;Task&amp;lt;string&amp;gt; MyMethodAsync()&amp;quot;, you want to have a unit test that 
make sure this method does what it&amp;#39;s supposed to do (one being it 
returns a &amp;quot;valid&amp;quot; Task&amp;lt;string&amp;gt; object, the other being that 
individual side-effects occur, if any).&amp;nbsp; Another context is dependent on
 asynchronicity--do individual units of code that do depend on 
asynchronous invocation (or depend on something being invoked 
asynchronously) &amp;quot;work&amp;quot;.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
It&amp;#39;s the second context that seems to be the hardest to grasp for most 
people to grasp and action.&amp;nbsp;&amp;nbsp;
Let&amp;#39;s take this example code:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;startButton_Click(&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;&amp;nbsp;e)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;br /&gt;		{&lt;br /&gt;			startButton.Enabled&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;			&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;webRequest&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebRequest&lt;/span&gt;.Create(&lt;span style="color:#a31515;"&gt;&amp;quot;http://google.ca&amp;quot;&lt;/span&gt;);&lt;br /&gt;			&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;response&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;await&lt;/span&gt;&amp;nbsp;webRequest.GetResponseAsync())&lt;br /&gt;			&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;response.GetResponseStream())&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(stream&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;;&lt;br /&gt;				&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;StreamReader&lt;/span&gt;(stream))&lt;br /&gt;				{&lt;br /&gt;					textBox.Text&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;await&lt;/span&gt;&amp;nbsp;reader.ReadToEndAsync();&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;br /&gt;		{&lt;br /&gt;			startButton.Enabled&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;A couple invariants that we want to test might be that the button is disabled during the asynchronous operations and enabled after the asynchronous operations.&amp;nbsp; It&amp;#39;s not immediately obvious what to in order to validate these invariants.&lt;/p&gt;
&lt;p&gt;When the compiler encounters the await operator, it actually goes searching for method that can act upon the type of the object being returned by the method used with the await operator.&amp;nbsp; In our first use of await (on GetResponseAsync()) the return type is Task&amp;lt;T&amp;gt; (Task&amp;lt;WebResponse&amp;gt; specifically, but for our example I&amp;#39;ll use Task&amp;lt;T&amp;gt;).&amp;nbsp; There&amp;#39;s various criteria the computer uses to search for this method, one method is to search for extension methods that match the name and return an &amp;quot;awaiter&amp;quot; type that has the following methods: BeginAwait and EndAwait (more details can be found in the Aync CTP documentation).&amp;nbsp; The compiler doesn&amp;#39;t allow us to inject an awaiter type in the normal run-time dependency injection semantics; but it does allow us to implement an awaiter that does support dependency injection at run-time.&amp;nbsp; To do this I would create an ITaskAwaiter interface like this:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;out&lt;/span&gt;&amp;nbsp;T&amp;gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;BeginAwait(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;nbsp;continuation);&lt;br /&gt;		T&amp;nbsp;EndAwait();&lt;br /&gt;	}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;I then need to create a GetAwaiter(this Task&amp;lt;T&amp;gt;) extension method to return an implementation of this type.&amp;nbsp; The built-in System.Runtime.CompilerServices.TaskAwaiter&amp;lt;T&amp;gt; is public; but, unfortunately it&amp;#39;s constructor (and the ability to pass in a Task&amp;lt;T&amp;gt;) object is internal.&amp;nbsp; So, we can&amp;#39;t simply wrap the built-in awaiter and delegate to it as a default.&amp;nbsp; We actually have to write an awaiter that mimics what the built-in one does.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiter&lt;/span&gt;&amp;lt;T&amp;gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;T&amp;gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;T&amp;gt;&amp;nbsp;task;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;TaskAwaiter(&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;T&amp;gt;&amp;nbsp;task)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;this&lt;/span&gt;.task&amp;nbsp;=&amp;nbsp;task;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;BeginAwait(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;nbsp;continuation)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(task.IsCompleted)&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;			&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;synchronizationContext&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SynchronizationContext&lt;/span&gt;.Current;&lt;br /&gt;			&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;gt;&amp;nbsp;action&amp;nbsp;=&amp;nbsp;theTask&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;br /&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;	{&lt;br /&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;		&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(synchronizationContext&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&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;		{&lt;br /&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;			synchronizationContext.Post(state&amp;nbsp;=&amp;gt;&amp;nbsp;continuation(),&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;br /&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;		}&lt;br /&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;		&lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;br /&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;		{&lt;br /&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;			continuation();&lt;br /&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;		}&lt;br /&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;	};&lt;br /&gt; &lt;br /&gt;			task.ContinueWith(action,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CancellationToken&lt;/span&gt;.None,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskContinuationOptions&lt;/span&gt;.ExecuteSynchronously,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskScheduler&lt;/span&gt;.Current);&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;T&amp;nbsp;EndAwait()&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;task.Result;&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;
&lt;p&gt;This class is given the Task&amp;lt;T&amp;gt; in question, it implements a BeginWait method that sets up an Action delegate to invoke the continuation given to it in a specific synchronization context, then tells the task to use that new action as it&amp;#39;s continuation via a call to ContinueWith.&amp;nbsp; When the task is completed EndAwait will be called and we simply return the result of the task.&lt;/p&gt;
&lt;p&gt;Now, in order to add the ability to inject a customer awaiter, we need to provide the GetAwaiter extension method.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;PRI.Extensions&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskExtensions&lt;/span&gt;&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;&amp;nbsp;GetAwaiter&amp;lt;TResult&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;TResult&amp;gt;&amp;nbsp;task)&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;TResult&amp;gt;.CreateTaskAwaiter&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&lt;br /&gt;					?&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;TResult&amp;gt;.CreateTaskAwaiter(task)&amp;nbsp;:&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;(task);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;
&lt;p&gt;This extension method invokes a factory method delegate to create the ITaskAwaiter&amp;lt;T&amp;gt; object (or simply creates our new default awaiter).&amp;nbsp; This factory method looks like this:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;TResult&amp;gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;TResult&amp;gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;&amp;gt;&amp;nbsp;createTaskAwaiter&amp;nbsp;=&amp;nbsp;task&amp;nbsp;=&amp;gt;&lt;br /&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;&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;&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;		&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;		Current&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;(task);&lt;br /&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;&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;&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 style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;Current;&lt;br /&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;&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;&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 style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;&amp;lt;TResult&amp;gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;&amp;gt;&amp;nbsp;CreateTaskAwaiter&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;get&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;createTaskAwaiter;&amp;nbsp;}&lt;br /&gt;			&lt;span style="color:blue;"&gt;set&lt;/span&gt;&lt;br /&gt;			{&lt;br /&gt;				createTaskAwaiter&amp;nbsp;=&amp;nbsp;task&amp;nbsp;=&amp;gt;&lt;br /&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;	{&lt;br /&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;		Current&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;value&lt;/span&gt;(task);&lt;br /&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;		&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;Current;&lt;br /&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;	};&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;TResult&amp;gt;&amp;nbsp;Current&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;	}&lt;/pre&gt;
&lt;p&gt;We can override this factory method and give a delegate to code that creates another type of ITaskAwaiter&amp;lt;T&amp;gt; implementation.&amp;nbsp; We also decorate the call to that provided delegate with something that keeps track of the Current awaiter (more on that later).&amp;nbsp; Now, we simply need to add a using statement within our namespace for the compiler to user our GetAwaiter when it compiles an await operator and use our factory.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;PRI.MainApplication&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;PRI.Extensions;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:green;"&gt;//...&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;We&amp;#39;re now all set to inject a new awaiter and be able to isolate our code from the framework and validate some invariants.&amp;nbsp; In our case, we&amp;#39;d like to check to make sure that the button is disabled during invocation of asynchronous operations and enabled when done.&amp;nbsp; So, we can create a spy awaiter that basically does nothing and sends back a fake or dummy object.&amp;nbsp; In our example we actually have two different types of Task&amp;lt;T&amp;gt; objects being awaited; so, we need to create a couple of awaiter spys.&amp;nbsp; One is generic and one is specific.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebResponseTaskAwaiterSpy&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;WebResponse&lt;/span&gt;&amp;gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;FakeWebResponse&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebResponse&lt;/span&gt;&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Stream&lt;/span&gt;&amp;nbsp;GetResponseStream()&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;(System.Text.&lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.ASCII.GetBytes(&lt;span style="color:#a31515;"&gt;&amp;quot;got&amp;nbsp;some&amp;nbsp;text&amp;quot;&lt;/span&gt;));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MainForm&lt;/span&gt;&amp;nbsp;form;&lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;ButtonEnabledState&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;WebResponseTaskAwaiterSpy(&lt;span style="color:#2b91af;"&gt;MainForm&lt;/span&gt;&amp;nbsp;form)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;this&lt;/span&gt;.form&amp;nbsp;=&amp;nbsp;form;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;BeginAwait(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;nbsp;continuation)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebResponse&lt;/span&gt;&amp;nbsp;EndAwait()&lt;br /&gt;		{&lt;br /&gt;			ButtonEnabledState&amp;nbsp;=&amp;nbsp;form.startButton.Enabled;&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;FakeWebResponse&lt;/span&gt;();&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterSpy&lt;/span&gt;&amp;lt;T&amp;gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ITaskAwaiter&lt;/span&gt;&amp;lt;T&amp;gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MainForm&lt;/span&gt;&amp;nbsp;form;&lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;ButtonEnabledState&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;TaskAwaiterSpy(&lt;span style="color:#2b91af;"&gt;MainForm&lt;/span&gt;&amp;nbsp;form)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;this&lt;/span&gt;.form&amp;nbsp;=&amp;nbsp;form;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;BeginAwait(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;nbsp;continuation)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;T&amp;nbsp;EndAwait()&lt;br /&gt;		{&lt;br /&gt;			ButtonEnabledState&amp;nbsp;=&amp;nbsp;form.startButton.Enabled;&lt;br /&gt;			&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;default&lt;/span&gt;(T);&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;
&lt;p&gt;Both classes don&amp;#39;t actually execute the task because we know task execution works and we know it works asynchronously--we&amp;#39;re not trying to test that.&amp;nbsp; The clases return false from BeginAwait to tell the generated code that the asynchronous code &amp;quot;completed&amp;quot; (we lie).&amp;nbsp; The generated code the calls the EndAwait method to get the result of the so-called asynchronous operation.&amp;nbsp; In both cases, we get the state of the button in EndAwait.&amp;nbsp; In the case of the generic spy, we simply return a dummy--the default value for that type parameter.&amp;nbsp; In the case of the WebResponse spy, we can&amp;#39;t send back a dummy because that would be a null value and we&amp;#39;d get NullReferenceEexceptions that would abort our test.&amp;nbsp; So, we create a FakeWebResponse object and send that back that basically creates a canned response stream in memory and sends it back and that will be used in our second await.&lt;/p&gt;
&lt;p&gt;Now, we can write a unit test for startButton_Click method.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre style="font-family:consolas;"&gt;	&lt;span style="color:#2b91af;"&gt;MainForm&lt;/span&gt;&amp;nbsp;form&amp;nbsp;=&amp;nbsp;CreateForm();&lt;br /&gt;	&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;WebResponse&lt;/span&gt;&amp;gt;.CreateTaskAwaiter&amp;nbsp;=&amp;nbsp;task&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebResponseTaskAwaiterSpy&lt;/span&gt;(form);&lt;br /&gt;	&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt;.CreateTaskAwaiter&amp;nbsp;=&amp;nbsp;task&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterSpy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt;(form);&lt;br /&gt; &lt;br /&gt;	form.startButton_Click(&lt;span style="color:blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;br /&gt; &lt;br /&gt;	&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;spy1&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;WebResponse&lt;/span&gt;&amp;gt;.Current&amp;nbsp;&lt;span style="color:blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;WebResponseTaskAwaiterSpy&lt;/span&gt;;&lt;br /&gt;	&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;spy2&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt;.Current&amp;nbsp;&lt;span style="color:blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TaskAwaiterSpy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;&amp;gt;;&lt;br /&gt; &lt;br /&gt;	&lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsTrue((spy2&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!spy2.ButtonEnabledState)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(spy1&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!spy1.ButtonEnabledState));&lt;br /&gt;	&lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(form.startButton.Enabled);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;This code injects our two types of awaiters (our spies), invokes the method, then checks the spies for the values we&amp;#39;re looking for as well as the current state of our button (we assume the current state at this point is the same state immediately after the asynchronous operation completed) to validate our invariants.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2010%2f11%2f04%2ftesting-strategies-involving-async-functions.aspx"&gt;&lt;img src="http://dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%253a%252f%252fmsmvps.com%252fblogs%252fpeterritchie%252farchive%252f2010%252f11%252f04%252ftesting-strategies-involving-async-functions.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1781600" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DevCenterPost/default.aspx">DevCenterPost</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+5/default.aspx">C# 5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Async+Functions/default.aspx">Async Functions</category></item><item><title>More on Async Functions</title><link>http://msmvps.com/blogs/peterritchie/archive/2010/10/29/more-on-async-functions.aspx</link><pubDate>Fri, 29 Oct 2010 20:12:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1781064</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1781064</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2010/10/29/more-on-async-functions.aspx#comments</comments><description>&lt;p&gt;In my last post I showed .Net 1.1 and .NET 2.0 code that performed some asychronous operations.&amp;nbsp; I then showed the new syntax with &amp;quot;async&amp;quot; and &amp;quot;await&amp;quot; that did the same thing.&lt;/p&gt;
&lt;p&gt;But, I didn&amp;#39;t detail what&amp;#39;s really going on in the new syntax.&lt;/p&gt;
&lt;p&gt;If you want to know more about the details of what&amp;#39;s going on, read on.&amp;nbsp; If you just trust me about the previous code, you don&amp;#39;t have to read on :)&lt;/p&gt;
&lt;p&gt;When the Click handler is executed it basically executes everything up to the first &lt;span style="font-family:courier new,courier;"&gt;await &lt;/span&gt;and returns.&amp;nbsp; This allows the UI to be responsive.&amp;nbsp; The compiler generates some code that takes the &lt;span style="font-family:courier new,courier;"&gt;Task&amp;lt;T&amp;gt;&lt;/span&gt; object that is returned from the async method and waits for it.&amp;nbsp; If there is code that needs to execute after the &lt;span style="font-family:courier new,courier;"&gt;await&lt;/span&gt;, then the compiler effectively generates a continuation.&amp;nbsp; With regard to &lt;span style="font-family:courier new,courier;"&gt;Task&amp;lt;T&amp;gt;&lt;/span&gt;, that&amp;#39;s basically a call to &lt;span style="font-family:courier new,courier;"&gt;Task&amp;lt;T&amp;gt;.ContinueWith&lt;/span&gt;.&amp;nbsp; Any other &lt;span style="font-family:courier new,courier;"&gt;await &lt;/span&gt;statements are collected in that continuation and the same thing is done, the continuation is executed up to the first await and returns...&lt;/p&gt;
&lt;p&gt;The underlying architecture knows about synchronization contexts and makes sure &amp;quot;synchronous&amp;quot; code within the &lt;span style="font-family:courier new,courier;"&gt;Click &lt;/span&gt;handler is executed on the UI thread.&amp;nbsp; So, as you saw in the example, we didn&amp;#39;t have to manually deal with marshaling back to the UI thread via &lt;span style="font-family:courier new,courier;"&gt;Control.Invoke().&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;My original example was overly simplistic and didn&amp;#39;t include anything to deal with disposal.&amp;nbsp; To a certain extent I&amp;#39;ve done async functions a disservice because async functions make disposal much, much easier.&amp;nbsp; For example, my .NET 4.0 code would do something like this:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;private void button_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;button.Enabled = false;&lt;br /&gt;&amp;nbsp;var webRequest = WebRequest.Create(&amp;quot;&lt;/span&gt;&lt;a href="http://google.ca"&gt;&lt;span style="font-family:courier new,courier;"&gt;http://google.ca&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;quot;);&lt;br /&gt;&amp;nbsp;webRequest.BeginGetResponse(asyncResult =&amp;gt;&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;var response = webRequest.EndGetResponse(asyncResult);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var stream = response.GetResponseStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (stream != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var reader = new StreamReader(stream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var text = reader.ReadToEnd();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BeginInvoke((MethodInvoker) (() =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox.Text = text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.Enabled = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((IDisposable) response).Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;((IDisposable)response).Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}, null);&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you can see, we can&amp;#39;t use the using statement because that assumes the block in which using block resides is run &lt;span style="line-height:115%;font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:black;font-size:9pt;mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA;"&gt;asynchronously&lt;/span&gt;, so we&amp;#39;re forced to manually call &lt;span style="font-family:courier new,courier;"&gt;Dispose &lt;/span&gt;(and in the case of &lt;span style="font-family:courier new,courier;"&gt;WebResponse&lt;/span&gt;, cast to &lt;span style="font-family:courier new,courier;"&gt;IDisposable &lt;/span&gt;first because it explicitly implements &lt;span style="font-family:courier new,courier;"&gt;IDisposable&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;With &lt;span style="font-family:courier new,courier;"&gt;await&lt;/span&gt;, we can write a block of code with bits of it being asynchronous and still use &lt;span style="font-family:courier new,courier;"&gt;using &lt;/span&gt;statements.&amp;nbsp; So, with async functions, our code can now dispose more cleanly; for example:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;private async void button1_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;button.Enabled = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var webRequest = WebRequest.Create(&amp;quot;&lt;/span&gt;&lt;a href="http://google.ca"&gt;&lt;span style="font-family:courier new,courier;"&gt;http://google.ca&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;using (var response = await webRequest.GetResponseAsync())&lt;br /&gt;&amp;nbsp;&amp;nbsp;using (var stream = response.GetResponseStream())&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (stream == null) return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var reader = new StreamReader(stream))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textBox.Text = await reader.ReadToEndAsync();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;finally&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;button.Enabled = true;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;C# 3&amp;nbsp;and lambda expressions make the act of using asynchronous methods much easier than .NET 1.x; the next version of C# with async functions takes it that final step forward.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1781064" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DevCenterPost/default.aspx">DevCenterPost</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+vNext/default.aspx">Visual Studio vNext</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+5/default.aspx">C# 5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Async+Functions/default.aspx">Async Functions</category></item></channel></rss>