<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7490533466356532174</id><updated>2012-02-16T14:47:31.107-08:00</updated><category term='C#2.0'/><category term='SQL'/><category term='JAVA'/><category term='VS 2010'/><category term='Question'/><category term='APS'/><category term='.net4'/><category term='VS Studio'/><category term='Interview'/><category term='Programming'/><category term='.NET'/><category term='ASP.NET'/><category term='Tutorial Sites'/><category term='C# 4.0'/><category term='C# 3.0'/><title type='text'>Smart Programming Spot</title><subtitle type='html'>This Blog Is Created For Make A Huge Software Professional Group&lt;br&gt; By : Mr. Bheemsen Singh [Web &amp;amp; Software Developer &amp;amp; DBA SQL Server]</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-5708902472709747889</id><published>2012-01-21T02:23:00.001-08:00</published><updated>2012-01-21T02:23:14.507-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net4'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='APS'/><title type='text'>ASP.NET 4.0 Features</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="start" style="background-color: white; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;&lt;span style="font-family: 'Times New Roman', Times, serif; font-size: 22px; line-height: 30px; text-align: left;"&gt;&lt;span style="color: #0c343d;"&gt;&lt;br /&gt;ASP.NET 4.0 Features&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="start" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="start" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;The focus of Microsoft’s latest&amp;nbsp;&lt;b&gt;ASP.NET 4&lt;/b&gt;has mainly been on improving the performance and Search-engine Optimization (SEO). In this article, I'll be taking a look at what I think are the most important new features in ASP.NET 4.&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; font-family: arial; font-size: 13px; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Output cache extensibility&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Session state compression&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;View state mode for individual control&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;i&gt;Page.MetaKeyword&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;Page.MetaDescription&lt;/i&gt;&amp;nbsp;properties&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;i&gt;Response.RedirectPermanent&lt;/i&gt;&amp;nbsp;method&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Routing in ASP.NET&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Increase the URL character length&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;New syntax for Html Encode&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Predictable Client IDs&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;i&gt;Web.config&lt;/i&gt;&amp;nbsp;file refactoring&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Auto-Start ASP.NET applications&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Improvements on Microsoft Ajax Library&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;I’ll describe the details of each of these features in the following sections.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Output Cache extensibility&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Output caching, or Page-Level Caching, caches the entire rendered markup of an ASP.NET web page for a specific time-period. This has always been one of the essential features for ASP.NET that is used extensively to increase application performance. However there have been some limitations on the feasible extent of caching, because cached content always had to be stored in-memory.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;But with ASP.NET 4.0 developers can extend their caching by using&amp;nbsp;&lt;b&gt;Output-cache providers&lt;/b&gt;. Developers can now create ‘output-cache providers’ that store the cache contents to any persistence mechanism such as databases, disks, cloud storage and distributed cache engines.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;To create a custom output-cache provider, a class which derived from&lt;b&gt;System.Web.Caching.OutputCacheProvider&lt;/b&gt;&amp;nbsp;has to be created in ASP.NET 4.0. There are four public methods which you have to override in order to provide your own implementation for add, remove, retrieve and update functionality. Also, the output-cache provider has to be registered in the&amp;nbsp;&lt;b&gt;web.config&lt;/b&gt;&amp;nbsp;file as shown in the following screen capture.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS1.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;You can also set this custom output-cache provider as your default cache mechanism. So once you add the page cache directives all of your contents will be stored using the custom output-cache provider.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS2.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Moreover, developers can also dynamically configure which output-cache Provider is used. For example you might want to cache the frequently access pages in the memory for faster access and less frequent pages on disk. By overriding the&amp;nbsp;&lt;b&gt;GetOutputCacheProviderName()&lt;/b&gt;&amp;nbsp;method you can configure which output cache provider to use for different requests. These additions to the output-cache can enable developers to write extensible and more efficient cache mechanisms to their web application and thereby improve its responsiveness.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Session State compression&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;The ASP.NET session state is a mechanism to maintain session-specific data through subsequent requests. In some instances, you may wish to store your session state data in a session-state server or in Microsoft SQL server. However, these two options require you to store data out of the web application’s worker process. To send across to the relevant sources, (State server or Microsoft SQL Server), session-state data has to be serialized. This can take a significant time if the size of the data to be serialized grows significantly. This will increase the latency of the application.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;This latency can be reduced if the size of the data is lessened by compression. ASP.NET 4.0 introduces a new mechanism to compress your session state data for both Session-state server and Microsoft SQL server.&amp;nbsp; Compression can be enabled by setting the&amp;nbsp;&lt;b&gt;compressionEnable&amp;nbsp;&lt;/b&gt;to true in the&amp;nbsp;&lt;b&gt;web.config&lt;/b&gt;&amp;nbsp;file. In this example, the session-state data will be serialized/desterilized using&amp;nbsp;&lt;b&gt;System.IO.Compression.GZipStream.&lt;/b&gt;&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&lt;sessionstate&lt; span=""&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; mode="SqlServer"&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; sqlConnectionString="data source=DB;Initial Catalog=LudmalDB"&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; allowCustomSqlDatabase="true"&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; compressionEnabled="true"&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;/&amp;gt;&lt;/span&gt;&lt;/sessionstate&lt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;With this compression feature, developers can often reduce the time it takes for a web application to respond by reducing the size of session data.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;View State mode for Individual Controls&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;View state is a mechanism to maintain page controls’ state on subsequent post backs. ASP.NET stores the view state data for controls that are in the page, even if it’s not necessary. Since the view state data is stored in the pages’ html, the size of the request object will be increased, and make performance worse.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;In ASP.NET 4.0, each web control will include a&amp;nbsp;&lt;b&gt;ViewStateMode&amp;nbsp;&lt;/b&gt;property which lets developers disable view-state by default, and enable it just for the controls for which a persistence of state is required.&amp;nbsp;&lt;i&gt;ViewStateMode&lt;/i&gt;&amp;nbsp;has the following three values;&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; font-family: arial; font-size: 13px; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Enabled – enables the view state for this control and any child control.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Disabled – disable the view state.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Inherits – this specify the control uses the settings from its parent control.&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;By setting these values in page controls accordingly, a significant performance improvement can be gained in response-time.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;&lt;i&gt;Page.MetaKeywords&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;Page.MetaDescription&lt;/i&gt;&amp;nbsp;properties&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;To increase the relevance of pages in searches, developers should &amp;nbsp;include relevant “keyword” and “description” meta tags in the html  section.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unfortunately, it takes some time to add these tags for each and every page, and the alternative of adding these tags programmatically was difficult.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;But with ASP.NET 4.0, there are two new properties in the code behind file;&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; font-family: arial; font-size: 13px; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;i&gt;Page.MetaDescription&lt;/i&gt;&amp;nbsp;– equivalent to meta name “description”&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;i&gt;Page.MetaKeywords&lt;/i&gt;&amp;nbsp;– equivalent to meta name “keywords”&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;This will enable developers to easily and programmatically add the relevant keywords and description.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS4.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;This will even be useful for Master pages—where you only have to add these properties in the master page. In addition to “keywords” and “description” settings in the code behind, developers can also set these values within the @Page directive.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;&lt;i&gt;Response.RedirectPermanent&lt;/i&gt;&amp;nbsp;Method&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;ASP.NET 4.0 has improved SEO (Search-engine Optimization) facilities. Typically developers use&lt;b&gt;Response.Redirect(string url&lt;/b&gt;&lt;i&gt;)&lt;/i&gt;&amp;nbsp;to handle requests for old URLs. However, this leads to an extra round trip to access the old URLs and so will negatively affect your page-ranking&amp;nbsp; in search-engines.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;ASP.NET 4.0 introduces a new&amp;nbsp;&lt;b&gt;Response.RedirectPermanent(string url)&lt;/b&gt;&amp;nbsp;helper method to be used as HTTP 301 (Moved permanently) to handle requests. This will enable search-engines to index URLs and content efficiently and thus improve the page rankings.&amp;nbsp;&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Routing in ASP.NET&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Routing will let developers serve meaningful URLs to users and map them with the actual physical files. This URL-rewriting mechanism enables developers to write high ranking, search-engine optimized web applications. For example, URL for a page which displays an actual product might look like the following;&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: #800039; font-size: 9.5pt;"&gt;http://www.ludmal.net/showproducts.aspx?prodId=24&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;By using routing the URL will look like the following&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: #800039; font-size: 9.5pt;"&gt;http://www.ludmal.net/products/ipod&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;In this way, the URLs will be more easily remembered by users. &amp;nbsp;It will also significantly improve the search-engine page rankings of the web site.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;The following example shows how to implement routing behavior in ASP.NET 4 using new&amp;nbsp;&lt;i&gt;MapPageRoute&lt;/i&gt;&amp;nbsp;in&lt;i&gt;Route&lt;/i&gt;&amp;nbsp;class.&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;public class Global : System.Web.HttpApplication&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;{&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;void Application_Start(object sender, EventArgs e)&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RouteTable.Routes.MapPageRoute("ProductsRoute",&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"product/{prodId}", "~/products.aspx");&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Increase the URL character length&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;In previous versions of ASP.NET, &amp;nbsp;URLs were limited to 260 characters in length. But in ASP.NET 4.0 developers have the option of increasing or decreasing &amp;nbsp;the length of URLs by using &amp;nbsp;the new&amp;nbsp;&lt;b&gt;maxRequestPathLength&lt;/b&gt;&amp;nbsp;and&lt;b&gt;maxQueryStringLength&lt;/b&gt;. I’ll illustrate this in an example.&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&lt;httpruntime maxquerystringlength="1024" maxrequestpathlength="360"&gt;&lt;/httpruntime&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;In previous versions of ASP.NET you were limited to a fixed set of characters but in v4, developers can also validate the invalid characters by specifying values in the&amp;nbsp;&lt;b&gt;requestPathInvalidChars&lt;/b&gt;&amp;nbsp;attribute.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;New syntax for Html Encode&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Html Encode method encodes a particular string to be displayed in a browser. It is important to encode strings prior it’s rendering in the page, mainly to avoid cross-site script injection (XSS) and HTML injection attacks. However, developers so often forget to call the encode function.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;In previous .NET versions,&amp;nbsp;&lt;b&gt;Server.HtmlEncode()&lt;/b&gt;&amp;nbsp;or&amp;nbsp;&lt;b&gt;HttpUtility.Encode()&lt;/b&gt;&amp;nbsp;methods has been used for string encoding as shown in the following example.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS5.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;ASP.NET 4.0 introduced new code expression syntax for encoding a particular string.&amp;nbsp; While the syntax will render the output it also encodes the relevant string as shown below. Note “&lt;b&gt;:&lt;/b&gt;” character after opening tag (“&amp;lt;%”).&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS6.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;The new encoding syntax provides an easy and concise way of encoding a particular string.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Predictable Client IDs&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;ASP.NET 4 now supports a new&amp;nbsp;&lt;b&gt;ClientIDMode&lt;/b&gt;&amp;nbsp;property for server control. This property indicates how the Client ID should be generated to a particular control when they render. Client ID has been an important property of the server controls recently—especially with the success of jQuery and other Ajax scripting technologies.&amp;nbsp; The ClientIDMode property has four values;&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; font-family: arial; font-size: 13px; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;AutoID&lt;/b&gt;&amp;nbsp;– This renders the output as it was before (example:&lt;i&gt;ctl00_ContentPlaceholder1_ListView1_ctrl0_Label1&lt;/i&gt;)&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;Predictable (Default)&lt;/b&gt;– Trims all “ctl00” strings in the Client Id property.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;Static&lt;/b&gt;&amp;nbsp;– Full control over the Client ID (developer can set the Client Id and it will not be changed after the control renders)&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;Inherit&lt;/b&gt;&amp;nbsp;– Allow control to inherit the behavior from its parent control&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Client ID property can be set in three different ways;&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; font-family: arial; font-size: 13px; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Directly on individual control&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;On the container control. (All the child controls will inherit the settings from parent/container control)&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Page or User Control level using &amp;lt;%@ Page%&amp;gt;&amp;nbsp; or &amp;lt;%@ Control %&amp;gt; directives.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;Directly in the&amp;nbsp;&lt;i&gt;web.config&lt;/i&gt;&amp;nbsp;file. All the controls within the web application will inherit the settings.&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;New&amp;nbsp;&lt;b&gt;ClientIDRowSuffix&lt;/b&gt;&amp;nbsp;property on databound controls also gives a similar functionality when rendering an each data item. Once you set the relevant databound property to ClientIDRowSuffix, the value will be added as a suffix to individual row elements.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS7.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;After the control renders the “State” value will be added as a suffix to each data row element.&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS8.JPG" /&gt;&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Web.config refactoring&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Over the past few years&amp;nbsp;&lt;b&gt;web.config&lt;/b&gt;&amp;nbsp;file has grown significantly as ASP.NET has used it for more and more features such as routing, Ajax, IIS 7 and version compatibility. This has made it trickier to maintain even with the Visual Studio environment.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;With ASP.NET 4, most of the major elements have been moved to the&amp;nbsp;&lt;b&gt;machine.config&lt;/b&gt;&amp;nbsp;file. This has enabled developers to maintain a cleaner, less cluttered,&amp;nbsp;&lt;i&gt;web.config&lt;/i&gt;&amp;nbsp;file. The new&amp;nbsp;&lt;b&gt;web.config&lt;/b&gt;&amp;nbsp;file is either empty, or includes just the .NET framework version details as shown in the following example.&lt;/div&gt;&lt;div class="listing" style="background-color: white; border-bottom-color: rgb(202, 202, 202); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(202, 202, 202); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(202, 202, 202); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(202, 202, 202); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 11px; margin-left: 20px; padding-bottom: 10px; padding-left: 3px; padding-right: 3px; padding-top: 10px;"&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; &lt;configuration&gt;&lt;/configuration&gt;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;system.web&gt;&lt;/system.web&gt;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;compilation targetframework="4.0"&gt;&amp;nbsp;&lt;/compilation&gt;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang="EN-US" style="color: blue; font-size: 9.5pt;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Auto-Start ASP.NET Applications&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Most application requires initial data load or caching operations to be done before serving the client requests. Typical this happens only when the first user request a page. However, often developers and web administrators write fake requests to keep the application alive to increase the response time. To overcome this issue, ASP.NET 4 introduce new Auto-Start feature. Auto-start feature available with IIS 7.5 and it initialize the ASP.NET application to accept requests.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;To configure the Auto-start, you need to configure the “Application pool” worker process by setting the startMode attribute to “AlwaysRunning” in the&amp;nbsp;&lt;i&gt;applicationHost.config&amp;nbsp;&lt;/i&gt;file. (C:\Windows\System32\inetsrv\config\applicationHost.config)&lt;/div&gt;&lt;div class="illustration" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-align: center;"&gt;&lt;img src="http://www.simple-talk.com/iwritefor/articlefiles/1012-LS9.JPG" /&gt;&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;As soon you save the&amp;nbsp;&lt;i&gt;applicationHost.config&amp;nbsp;&lt;/i&gt;file the worker process will start and initialize the required application operations before the first user has been served.&lt;/div&gt;&lt;h2 style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; margin-left: 20px;"&gt;Improvements on Microsoft Ajax Library&lt;/h2&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;Microsoft Ajax library is client side library which includes high performance server –based user controls and asynchronous page rendering controls. Ajax Library enables developers to easily and quickly write responsive database-driven applications.&lt;/div&gt;&lt;div style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-left: 20px; text-align: justify;"&gt;There are some significant improvements in the Ajax Library in the ASP.NET 4. of which the most important seem to be...&lt;/div&gt;&lt;ul style="background-color: white; color: #333333; line-height: 17px; margin-top: 0px;"&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;Scrip Loader&lt;/b&gt;&amp;nbsp;– the new script loader control enable developers to load all the required scripts only once, thereby eliminating the unnecessary subsequent requests to the server. It supports the ‘lazy load’ pattern which loads scripts only when necessary, and loads scripts in combination, in order to increase the performance of loading a page. It also supports the&amp;nbsp;&lt;i&gt;jQuery&lt;/i&gt;&amp;nbsp;script and custom scripts.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;&lt;i&gt;JQuery&lt;/i&gt;&amp;nbsp;Integration&lt;/b&gt;&amp;nbsp;–&amp;nbsp;&lt;i&gt;JQuery&lt;/i&gt;&amp;nbsp;is very popular third party javascript library. ASP.NET 4 extensively supports the integration for&amp;nbsp;&lt;i&gt;jQuery&lt;/i&gt;&amp;nbsp;by mixing the&amp;nbsp;&lt;i&gt;jQuery&lt;/i&gt;&amp;nbsp;and Ajax plug-ins seamlessly.&lt;/li&gt;&lt;li style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; margin-bottom: 3px; margin-left: 20px; margin-top: 0px; text-align: justify;"&gt;&lt;b&gt;Client Data Access&lt;/b&gt;&amp;nbsp;– by using pre-defined client controls inside the Ajax Library, developers can easily build asynchronous data-driven applications. For example client&amp;nbsp;&lt;b&gt;DataView&amp;nbsp;&lt;/b&gt;control will display one or more records by consuming a WCF service. All the relevant time-consuming operations will be handled by the Ajax library asynchronously.&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: #333333; font-family: 'Times New Roman', Times, serif;"&gt;&lt;span style="font-size: 17px; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Times New Roman', Times, serif; font-size: 17px; line-height: 17px;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: justify;"&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;ASP.NET 4 includes plethora of new features which will enable developers to write high performance, search-engine friendly web application quickly. The features I’ve mentioned seem to be the most important of all the new features in ASP.NET 4. By upgrading your existing web applications to up-coming ASP.NET 4, you are likely to see an improvement in performance and search-engine optimization.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-5708902472709747889?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/5708902472709747889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2012/01/aspnet-40-features.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/5708902472709747889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/5708902472709747889'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2012/01/aspnet-40-features.html' title='ASP.NET 4.0 Features'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-2308721650980531734</id><published>2011-11-06T23:45:00.000-08:00</published><updated>2011-11-06T23:45:12.617-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Interview'/><category scheme='http://www.blogger.com/atom/ns#' term='Question'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>Interview Questions on Java</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;h2 style="background-color: white; font-family: arial; text-align: -webkit-auto;"&gt;&lt;strong style="font-size: 13px; line-height: 20px;"&gt;What if the main method is declared as private?&lt;/strong&gt;&lt;/h2&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The program compiles properly but at runtime it will give “Main method not public.” message.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is meant by pass by reference and pass by value in Java?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Pass by reference means, passing the address itself rather than passing the value. Pass by value means passing a copy of the value.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;If you’re overriding the method equals() of an object, which other method you might also consider?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;hashCode()&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is Byte Code?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What gives java it’s “write once and run anywhere” nature?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;All Java programs are compiled into class files that contain bytecodes. These byte codes can be run in any platform and hence java is said to be platform independent.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Expain the reason for each keyword of public static void main(String args[])?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span class="style4" style="color: #585656; font-weight: bold; line-height: 1.6; text-decoration: underline;"&gt;public&lt;/span&gt;- main(..) is the first method called by java environment when a program is executed so it has to accessible from java environment. Hence the access specifier has to be public.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span class="style4" style="color: #585656; font-weight: bold; line-height: 1.6; text-decoration: underline;"&gt;static&lt;/span&gt;: Java environment should be able to call this method without creating an instance of the class , so this method must be declared as static.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span class="style4" style="color: #585656; font-weight: bold; line-height: 1.6; text-decoration: underline;"&gt;void&lt;/span&gt;: main does not return anything so the return type must be void&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The argument String indicates the argument type which is given at the command line and arg is an array for string given during command line.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What are the differences between == and .equals() ?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;what is difference between == and equals&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Difference between == and equals method&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What would you use to compare two String variables – the operator == or the method equals()?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;How is it possible for two String objects with identical values not to be equal under the == operator?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The == operator compares two objects to determine if they are the same object in memory i.e. present in the same memory location. It is possible for two String objects to have the same value, but located in different areas of memory.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;== compares references while .equals compares contents. The method public boolean equals(Object obj) is provided by the Object class and can be overridden. The default implementation returns true only if the object is compared with itself, which is equivalent to the equality operator == being used to compare aliases to the object. String, BitSet, Date, and File override the equals() method. For two String objects, value equality means that they contain the same character sequence. For the Wrapper classes, value equality means that the primitive values are equal.&lt;/div&gt;&lt;table border="0" cellpadding="2" cellspacing="2" style="background-color: white; color: black; font-family: arial; font-size: 13px; line-height: 20px; width: 600px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#fafadf"&gt;&lt;pre&gt;&amp;nbsp;public class EqualsTest {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;  String s1 = "abc";&lt;br /&gt;  String s2 = s1;&lt;br /&gt;  String s5 = "abc";&lt;br /&gt;  String s3 = new String("abc");&lt;br /&gt;  String s4 = new String("abc");&lt;br /&gt;  System.out.println("== comparison : " + (s1 == s5));&lt;br /&gt;  System.out.println("== comparison : " + (s1 == s2));&lt;br /&gt;  System.out.println("Using equals method : " + s1.equals(s2));&lt;br /&gt;  System.out.println("== comparison : " + s3 == s4);&lt;br /&gt;  System.out.println("Using equals method : " + s3.equals(s4));&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span class="style4" style="color: #585656; font-weight: bold; line-height: 1.6; text-decoration: underline;"&gt;Output&lt;/span&gt;&lt;br /&gt;== comparison : true&lt;br /&gt;== comparison : true&lt;br /&gt;Using equals method : true&lt;br /&gt;false&lt;br /&gt;Using equals method : true&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What if the static modifier is removed from the signature of the main method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What if I do not provide the String array as the argument to the method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Program compiles. But at runtime throws an error “NoSuchMethodError”.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Why oracle Type 4 driver is named as oracle thin driver?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Oracle provides a Type 4 JDBC driver, referred to as the Oracle “thin” driver. This driver includes its own implementation of a TCP/IP version of Oracle’s Net8 written entirely in Java, so it is platform independent, can be downloaded to a browser at runtime, and does not require any Oracle software on the client side. This driver requires a TCP/IP listener on the server side, and the client connection string uses the TCP/IP port address, not the TNSNAMES entry for the database name.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between final, finally and finalize? What do you understand by the java final keyword?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is final, finalize() and finally?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is finalize() method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between final, finally and finalize?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What does it mean that a class or member is final?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;o&amp;nbsp;&lt;strong&gt;final&lt;/strong&gt;&amp;nbsp;– declare constant&lt;br /&gt;o&amp;nbsp;&lt;strong&gt;finally&lt;/strong&gt;&amp;nbsp;– handles exception&lt;br /&gt;o&amp;nbsp;&lt;strong&gt;finalize&lt;/strong&gt;&amp;nbsp;– helps in garbage collection&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Variables defined in an interface are implicitly final. A final class can’t be extended i.e., final class may not be subclassed. This is done for security reasons with basic classes like String and Integer. It also allows the compiler to make some optimizations, and makes thread safety a little easier to achieve. A final method can’t be overridden when its class is inherited. You can’t change value of a final variable (is a constant). finalize() method is used just before an object is destroyed and garbage collected. finally, a key word used in exception handling and will be executed whether or not an exception is thrown. For example, closing of open connections is done in the finally method.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the Java API?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The Java API is a large collection of ready-made software components that provide many useful capabilities, such as graphical user interface (GUI) widgets.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the GregorianCalendar class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The GregorianCalendar provides support for traditional Western calendars.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the ResourceBundle class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The ResourceBundle class is used to store locale-specific resources that can be loaded by a program to tailor the program’s appearance to the particular locale in which it is being run.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Why there are no global variables in Java?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Global variables are globally accessible. Java does not support globally accessible variables due to following reasons:&lt;/div&gt;&lt;ul style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;li&gt;The global variables breaks the referential transparency&lt;/li&gt;&lt;li&gt;Global variables creates collisions in namespace.&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;How to convert String to Number in java program?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The valueOf() function of Integer class is is used to convert string to Number. Here is the code example:&lt;br /&gt;String numString = “1000″;&lt;br /&gt;int id=Integer.valueOf(numString).intValue();&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the SimpleTimeZone class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The SimpleTimeZone class provides support for a Gregorian calendar.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between a while statement and a do statement?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;A while statement (pre test) checks at the beginning of a loop to see whether the next loop iteration should occur. A do while statement (post test) checks at the end of a loop to see whether the next iteration of a loop should occur. The do statement will always execute the loop body at least once.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the Locale class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The Locale class is used to tailor a program output to the conventions of a particular geographic, political, or cultural region.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Describe the principles of OOPS.&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;There are three main principals of oops which are called Polymorphism, Inheritance and Encapsulation.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Explain the Inheritance principle.&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Inheritance is the process by which one object acquires the properties of another object. Inheritance allows well-tested procedures to be reused and enables changes to make once and have effect in all relevant places&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is implicit casting?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Implicit casting is the process of simply assigning one entity to another without any transformation guidance to the compiler. This type of casting is not permitted in all kinds of transformations and may not work for all scenarios.&lt;/div&gt;&lt;div class="style4" style="background-color: white; color: #585656; font-family: arial; font-size: 13px; font-weight: bold; line-height: 20px; text-align: -webkit-auto; text-decoration: underline;"&gt;Example&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;int i = 1000;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;long j = i; //Implicit casting&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Is sizeof a keyword in java?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The sizeof operator is not a keyword.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is a native method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;A native method is a method that is implemented in a language other than Java.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;In System.out.println(), what is System, out and println?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;System is a predefined final class, out is a PrintStream object and println is a built-in overloaded method in the out object.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What are Encapsulation, Inheritance and Polymorphism&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Explain the Polymorphism principle. Explain the different forms of Polymorphism.&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Polymorphism in simple terms means one name many forms. Polymorphism enables one entity to be used as a general category for different types of actions. The specific action is determined by the exact nature of the situation.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span class="style4" style="color: #585656; font-weight: bold; line-height: 1.6; text-decoration: underline;"&gt;Polymorphism exists in three distinct forms in Java:&lt;/span&gt;&lt;br /&gt;• Method overloading&lt;br /&gt;• Method overriding through inheritance&lt;br /&gt;• Method overriding through the Java interface&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is explicit casting?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Explicit casting in the process in which the complier are specifically informed to about transforming the object.&lt;/div&gt;&lt;div class="style4" style="background-color: white; color: #585656; font-family: arial; font-size: 13px; font-weight: bold; line-height: 20px; text-align: -webkit-auto; text-decoration: underline;"&gt;Example&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;long i = 700.20;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;int j = (int) i; //Explicit casting&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the Java Virtual Machine (JVM)?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The Java Virtual Machine is software that can be ported onto various hardware-based platforms&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What do you understand by downcasting?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The process of Downcasting refers to the casting from a general to a more specific type, i.e. casting down the hierarchy&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What are Java Access Specifiers?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between public, private, protected and default Access Specifiers?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What are different types of access modifiers?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Access specifiers are keywords that determine the type of access to the member of a class. These keywords are for allowing&lt;br /&gt;privileges to parts of a program such as functions and variables. These are:&lt;br /&gt;•&amp;nbsp;&lt;em&gt;Public&amp;nbsp;&lt;/em&gt;: accessible to all classes&lt;br /&gt;•&amp;nbsp;&lt;em&gt;Protected&lt;/em&gt;&amp;nbsp;: accessible to the classes within the same package and any subclasses.&lt;br /&gt;•&amp;nbsp;&lt;em&gt;Private&amp;nbsp;&lt;/em&gt;: accessible only to the class to which they belong&lt;br /&gt;•&amp;nbsp;&lt;em&gt;Default :&lt;/em&gt;&amp;nbsp;accessible to the class to which they belong and to subclasses within the same package&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Which class is the superclass of every class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Object.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Name primitive Java types.&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The 8 primitive types are byte, char, short, int, long, float, double, and boolean.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between static and non-static variables?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What are class variables?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is static in java?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Or&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is a static method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;A static variable is associated with the class as a whole rather than with specific instances of a class. Each object will share a common copy of the static variables i.e. there is only one copy per class, no matter how many objects are created from it. Class variables or static variables are declared with the static keyword in a class. These are declared outside a class and stored in static memory. Class variables are mostly used for constants. Static variables are always called by the class name. This variable is created when the program starts and gets destroyed when the programs stops. The scope of the class variable is same an instance variable. Its initial value is same as instance variable and gets a default value when its not initialized corresponding to the data type. Similarly, a static method is a method that belongs to the class rather than any object of the class and doesn’t apply to an object or even require that any objects of the class have been instantiated.&lt;br /&gt;Static methods are implicitly final, because overriding is done based on the type of the object, and static methods are attached to a class, not an object. A static method in a superclass can be shadowed by another static method in a subclass, as long as the original method was not declared final. However, you can’t override a static method with a non-static method. In other words, you can’t change a static method into an instance method in a subclass.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Non-static variables take on unique values with each object instance.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between the boolean &amp;amp; operator and the &amp;amp;&amp;amp; operator?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;If an expression involving the boolean &amp;amp; operator is evaluated, both operands are evaluated, whereas the &amp;amp;&amp;amp; operator is a short cut operator. When an expression involving the &amp;amp;&amp;amp; operator is evaluated, the first operand is evaluated. If the first operand returns a value of true then the second operand is evaluated. If the first operand evaluates to false, the evaluation of the second operand is skipped.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;How does Java handle integer overflows and underflows?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;It uses those low order bytes of the result that can fit into the size of the type allowed by the operation.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What if I write static public void instead of public static void?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Program compiles and runs properly.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the difference between declaring a variable and defining a variable?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;In declaration we only mention the type of the variable and its name without initializing it. Defining means declaration + initialization. E.g. String s; is just a declaration while String s = new String (“bob”); Or String s = “bob”; are both definitions.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What type of parameter passing does Java support?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;In Java the arguments (primitives and objects) are always passed by value. With objects, the object reference itself is passed by value and so both the original reference and parameter copy both refer to the same object.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Explain the Encapsulation principle.&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Encapsulation is a process of binding or wrapping the data and the codes that operates on the data into a single entity. This keeps the data safe from outside interface and misuse. Objects allow procedures to be encapsulated with their data to reduce potential interference. One way to think about encapsulation is as a protective wrapper that prevents code and data from being arbitrarily accessed by other code defined outside the wrapper.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What do you understand by a variable?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Variable is a named memory location that can be easily referred in the program. The variable is used to hold the data and it can be changed during the course of the execution of the program.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What do you understand by numeric promotion?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The Numeric promotion is the conversion of a smaller numeric type to a larger numeric type, so that integral and floating-point operations may take place. In the numerical promotion process the byte, char, and short values are converted to int values. The int values are also converted to long values, if necessary. The long and float values are converted to double values, as required.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What do you understand by casting in java language? What are the types of casting?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The process of converting one data type to another is called Casting. There are two types of casting in Java; these are implicit casting and explicit casting.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is the first argument of the String array in main method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;The String array is empty. It does not have any element. This is unlike C/C++ where the first element by default is the program name. If we do not provide any arguments on the command line, then the String array of main method will be empty but not null.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;How can one prove that the array is not null but empty?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Print array.length. It will print 0. That means it is empty. But if it would have been null then it would have thrown a NullPointerException on attempting to print array.length.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Can an application have multiple classes having main method?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Yes. While starting the application we mention the class name to be run. The JVM will look for the main method only in the class whose name you have mentioned. Hence there is not conflict amongst the multiple classes having main method.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;When is static variable loaded? Is it at compile time or runtime? When exactly a static block is loaded in Java?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Static variable are loaded when classloader brings the class to the JVM. It is not necessary that an object has to be created. Static variables will be allocated memory space when they have been loaded. The code in a static block is loaded/executed only once i.e. when the class is first initialized. A class can have any number of static blocks. Static block is not member of a class, they do not have a return statement and they cannot be called directly. Cannot contain this or super. They are primarily used to initialize static fields.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Can I have multiple main methods in the same class?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial; font-size: xx-small;"&gt;&lt;span style="font-size: 10pt;"&gt;We can have multiple overloaded main methods but there can be&amp;nbsp;&lt;strong&gt;only one main method with the following signature :&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span style="font-family: Arial; font-size: xx-small;"&gt;&lt;span style="font-size: 10pt;"&gt;public static void main(String[] args) {}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;No the program fails to compile. The compiler says that the main method is already defined in the class.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Explain working of Java Virtual Machine (JVM)?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;JVM is an abstract computing machine like any other real computing machine which first converts .java file into .class file by using Compiler (.class is nothing but byte code file.) and Interpreter reads byte codes.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;How can I swap two variables without using a third variable?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Add two variables and assign the value into First variable. Subtract the Second value with the result Value. and assign to Second variable. Subtract the Result of First Variable With Result of Second Variable and Assign to First Variable. Example:&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;int a=5,b=10;a=a+b; b=a-b; a=a-b;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;em&gt;An other approach to the same question&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;You use an XOR swap.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;for example:&lt;/strong&gt;&lt;br /&gt;int a = 5; int b = 10;&lt;br /&gt;a = a ^ b;&lt;br /&gt;b = a ^ b;&lt;br /&gt;a = a ^ b;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is data encapsulation?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Encapsulation may be used by creating ‘get’ and ‘set’ methods in a class (JAVABEAN) which are used to access the fields of the object. Typically the fields are made private while the get and set methods are public. Encapsulation can be used to validate the data that is to be stored, to do calculations on data that is stored in a field or fields, or for use in introspection (often the case when using javabeans in Struts, for instance). Wrapping of data and function into a single unit is called as data encapsulation. Encapsulation is nothing but wrapping up the data and associated methods into a single unit in such a way that data can be accessed with the help of associated methods. Encapsulation provides data security. It is nothing but data hiding.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is reflection API? How are they implemented?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Reflection is the process of introspecting the features and state of a class at runtime and dynamically manipulate at run time. This is supported using Reflection API with built-in classes like Class, Method, Fields, Constructors etc. Example: Using Java Reflection API we can get the class name, by using the getName method.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Does JVM maintain a cache by itself? Does the JVM allocate objects in heap? Is this the OS heap or the heap maintained by the JVM? Why&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Yes, the JVM maintains a cache by itself. It creates the Objects on the HEAP, but references to those objects are on the STACK.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is phantom memory?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Phantom memory is false memory. Memory that does not exist in reality.&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;Can a method be static and synchronized?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;A static method can be synchronized. If you do so, the JVM will obtain a lock on the java.lang.&lt;br /&gt;Class instance associated with the object. It is similar to saying:&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;synchronized(XYZ.class) {&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;}&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;&lt;strong&gt;What is difference between String and StringTokenizer?&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;A StringTokenizer is utility class used to break up string.&lt;/div&gt;&lt;div class="style4" style="background-color: white; color: #585656; font-family: arial; font-size: 13px; font-weight: bold; line-height: 20px; text-align: -webkit-auto; text-decoration: underline;"&gt;Example:&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;StringTokenizer st = new StringTokenizer(“Hello World”);&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;while (st.hasMoreTokens()) {&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;System.out.println(st.nextToken());&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;}&lt;/div&gt;&lt;div class="style4" style="background-color: white; color: #585656; font-family: arial; font-size: 13px; font-weight: bold; line-height: 20px; text-align: -webkit-auto; text-decoration: underline;"&gt;Output:&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;Hello&lt;/div&gt;&lt;div style="background-color: white; font-family: arial; font-size: 13px; line-height: 20px; text-align: -webkit-auto;"&gt;World&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-2308721650980531734?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/2308721650980531734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/11/interview-questions-on-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/2308721650980531734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/2308721650980531734'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/11/interview-questions-on-java.html' title='Interview Questions on Java'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-5223289063263093670</id><published>2011-05-12T08:28:00.000-07:00</published><updated>2011-05-13T13:34:33.591-07:00</updated><title type='text'>7 Surprising Trends That Show What Tech Skills You Need to Succeed</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;h1 class="titlelink"&gt;&lt;a href="http://www.readwriteweb.com/enterprise/2011/05/it-hiring-and-salaries-up---wh.php" title="Permanent link to 7 Surprising Trends That Show What Tech Skills You Need to Succeed"&gt;7 Surprising Trends That Show What Tech Skills You Need to Succeed&lt;/a&gt;&lt;/h1&gt;&lt;h1 class="titlelink"&gt;&amp;nbsp;&lt;/h1&gt;&lt;h1 class="titlelink"&gt;IT salaries are up after a two year decline, according to &lt;a href="http://www.cio.com/article/681726/IT_Pay_Creeps_Up_After_Two_Year_Downward_Spiral"&gt;CIO.com&lt;/a&gt;. That's good news, considering the &lt;a href="http://www.readwriteweb.com/enterprise/2010/10/confirmed-it-workers-still-loo.php"&gt;level of dissatisfaction IT professionals are experiencing&lt;/a&gt;.  &lt;/h1&gt;Meanwhile, hiring is up as well. &lt;a href="http://www.enterpriseirregulars.com/35176/it-jobs-recovery-continues-picks-up-steam/"&gt;Dennis B. Moore has analyzed&lt;/a&gt; listings from &lt;a href="http://dice.com/"&gt;Dice.com&lt;/a&gt;  and  found an overall increase of 6.1% in the past three months, and a  46.2% increase over the past year. Moore looked at four areas: database,  applications, languages and platforms. Moore found some surprising  results.&lt;br /&gt;Here are some of the biggest surprises. Keep in mind that these are  just the results for one job board and may not be representative of the  industry overall:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Demand for Hadoop knowledge grew slower than other NoSQL related technologies.&lt;/strong&gt; However, there were still more Hadoop jobs than there were jobs in every other NoSQL technology combined. Also, traditional &lt;a href="http://www.readwriteweb.com/enterprise/2011/05/from-big-data-to-nosql-the-rea.php"&gt;RDBMS&lt;/a&gt; technologies are still the most popular, with the most jobs and strong growth.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Demand for Oracle eBusiness Suite skills dipped.&lt;/strong&gt;  Skills on Oracle's database, unsurprisingly, remained strong. SAP hiring  experienced the most growth in the applications area in the past three  months, followed by PeopleSoft.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Silverlight overtook Flash.&lt;/strong&gt; Silverlight jobs  experienced 12.6% growth in the past three months, while Flash  experienced just 2.2%. Silverlight also surpassed Flash in total number  of jobs, with 982 job listings for Silverlight and 646 for Flash.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Demand for iPad skills decreased by 3.5%.&lt;/strong&gt; However,  iOS demand increased by 24.9%. Moore didn't tracked Macintosh or OSX  demand in the past so he couldn't make a comparison. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Android had 1,019 jobs, which beat iOS' 832 jobs.&lt;/strong&gt; But iOS is growing faster, at a rate of 24.9% to Android's 19.8%.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;There was an increased demand for skills in Facebook and Twitter.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Azure was the fastest growing platform, with 80.7% growth.&lt;/strong&gt; But it still trailed Amazon in total number of jobs 1,019 to 103.&lt;/li&gt;&lt;/ul&gt;The five programming languages with the top growth in the past three months were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;HTML5 (45.2%)&lt;/li&gt;&lt;li&gt;SAP Sybase PowerBuilder (26.0%)&lt;/li&gt;&lt;li&gt;Ruby (15.8%)&lt;/li&gt;&lt;li&gt;Python (15.8%)&lt;/li&gt;&lt;li&gt;Silverlight (12.6%)&lt;/li&gt;&lt;/ol&gt;PowerBuilder demand grew quickly, but only had 155 jobs total.  Assembler also experienced strong growth at 12.2% in the past three  months, but only had 212 jobs.  Moore didn't rank Node.js separately  from JavaScript, so there's no indication of how quickly demand for it  is growing.&lt;br /&gt;"There was such strong demand growth for all skills, that it is more  useful in this category to speak about the area of weakest growth -  Adobe Flash," Moore wrote.&lt;br /&gt;The top languages, by total number of jobs, were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Java (16,152 jobs)&lt;/li&gt;&lt;li&gt;HTML (9,736 jobs) &lt;/li&gt;&lt;li&gt;XML (9,651)&lt;/li&gt;&lt;li&gt;JavaScript (9,618)&lt;/li&gt;&lt;li&gt;C# (7,940)&lt;/li&gt;&lt;/ol&gt;Take aways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft professionals are doing well, with strong growth in C#, Silverlight and Azure.&lt;/li&gt;&lt;li&gt;Java is still sitting pretty, &lt;a href="http://www.readwriteweb.com/enterprise/2011/02/javas-not-dying-its-mutating.php"&gt;as expected&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;SAP is rebounding.&lt;/li&gt;&lt;li&gt;Oracle database skills remain vital, but other Oracle applications are questionable.&lt;/li&gt;&lt;li&gt;Demand for CRM skills are in decline, with Siebel, Salesforce.com  and Microsoft Dynamics all taking hits in the past three months.&lt;/li&gt;&lt;li&gt;NoSQL is a small but growing niche.&lt;/li&gt;&lt;li&gt;You can't go wrong with HTML5 and JavaScript.&lt;/li&gt;&lt;/ul&gt;&lt;h1 class="titlelink"&gt;&amp;nbsp;&lt;/h1&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-5223289063263093670?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/5223289063263093670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/05/7-surprising-trends-that-show-what-tech.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/5223289063263093670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/5223289063263093670'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/05/7-surprising-trends-that-show-what-tech.html' title='7 Surprising Trends That Show What Tech Skills You Need to Succeed'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-6441243754338597168</id><published>2011-05-12T08:27:00.000-07:00</published><updated>2011-05-13T13:34:33.411-07:00</updated><title type='text'>Programming is…</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;h2 class="posttitle" id="post-1181"&gt;&lt;a href="http://www.mrclay.org/2011/04/01/programming-is/" rel="bookmark" title="Permanent Link: Programming is…"&gt;Programming is…&lt;/a&gt;&lt;/h2&gt;&lt;div class="entry"&gt;     Myth: Programmers get to write code all day.&lt;br /&gt;Truth: Most programmers spend a ton of time (in no particular order):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Carefully composing e-mails to other programmers/mailing lists/non-technical folks&lt;/li&gt;&lt;li&gt;Sitting in on meetings, working on mockups and DB schemas, worrying about performance implications of proposed features&lt;/li&gt;&lt;li&gt;Writing bug reports and searching through bug DBs&lt;/li&gt;&lt;li&gt;Scrambling to figure out why systems with numerous opaque layers are  failing, digging through multi-GB log files with command line tools&lt;/li&gt;&lt;li&gt;Explaining downtime to users/higher ups&lt;/li&gt;&lt;li&gt;Contributing solutions to strangers’ problems&lt;/li&gt;&lt;li&gt;Reading documentation/books/programming blogs/release notes/vulnerability announcements&lt;/li&gt;&lt;li&gt;Searching for existing code that does what you want, maybe without knowing what that’s called&lt;/li&gt;&lt;li&gt;Evaluating if code you found solves your problem/would perform  acceptably/fits in your environment/has a compatible license/has a  lasting support community&lt;/li&gt;&lt;li&gt;Installing, configuring, and testing a codebase then finding it won’t work for you&lt;/li&gt;&lt;li&gt;Googling error messages&lt;/li&gt;&lt;li&gt;Digging through public code repositories to see “how [some open source project] does it”&lt;/li&gt;&lt;li&gt;Learning source control tools, bash, GNU utilities, and Linux file permissions (and/or the Windows equivalents)&lt;/li&gt;&lt;li&gt;Configuring IDEs, virtual machines, web servers, databases&lt;/li&gt;&lt;li&gt;Figuring out how to shoehorn together codebases that weren’t designed to coexist&lt;/li&gt;&lt;li&gt;Determining which tasks to prioritize from an endless supply&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-6441243754338597168?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/6441243754338597168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/05/programming-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/6441243754338597168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/6441243754338597168'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/05/programming-is.html' title='Programming is…'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-2975289329926920808</id><published>2011-04-06T05:19:00.000-07:00</published><updated>2011-04-06T05:19:38.139-07:00</updated><title type='text'>ASP.NET Tutorial - Membership and Roles - Part2</title><content type='html'>&lt;iframe src="http://www.youtube.com/embed/QItXodn9XMI?fs=1" allowfullscreen="" width="480" frameborder="0" height="295"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-2975289329926920808?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/2975289329926920808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/04/aspnet-tutorial-membership-and-roles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/2975289329926920808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/2975289329926920808'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/04/aspnet-tutorial-membership-and-roles.html' title='ASP.NET Tutorial - Membership and Roles - Part2'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/QItXodn9XMI/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-1899123636195666733</id><published>2011-04-06T05:13:00.000-07:00</published><updated>2011-04-06T05:13:08.147-07:00</updated><title type='text'>Personalization and Profiles in ASP.NET 3.5 Tutorial</title><content type='html'>&lt;iframe src="http://www.youtube.com/embed/ylEE4b6Sv7o?fs=1" allowfullscreen="" width="425" frameborder="0" height="344"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-1899123636195666733?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/1899123636195666733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/04/personalization-and-profiles-in-aspnet.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/1899123636195666733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/1899123636195666733'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/04/personalization-and-profiles-in-aspnet.html' title='Personalization and Profiles in ASP.NET 3.5 Tutorial'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ylEE4b6Sv7o/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-4781004042417176892</id><published>2011-01-11T05:42:00.000-08:00</published><updated>2011-01-11T05:42:08.475-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL – Simple Questions with Answers</title><content type='html'>&lt;span style="font-size: large;"&gt;&lt;b&gt;SQL INTERVIEW QUESTIONS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Q: What is SQL? &lt;br /&gt;A: SQL stands for ‘Structured Query Language’.&lt;br /&gt;Q: What is SELECT statement?&lt;br /&gt;A: The SELECT statement lets you  select a set of values from a table in a database. The values selected  from the database table would depend on the various conditions that are  specified in the SQL query.&lt;br /&gt;Q: How can you compare a part of the name rather than the entire name?&lt;br /&gt;A: SELECT * FROM people WHERE empname LIKE ‘%ab%’&lt;br /&gt;Would return a recordset with records consisting empname the sequence ‘ab’ in empname .&lt;br /&gt;Q: What is the INSERT statement? &lt;br /&gt;A: The INSERT statement lets you insert information into a database.&lt;br /&gt;Q: How do you delete a record from a database? &lt;br /&gt;A: Use the DELETE statement to remove records or any particular column values from a database.&lt;br /&gt;Q: How could I get distinct entries from a table?&lt;br /&gt;A: The SELECT  statement in conjunction with DISTINCT lets you select a set of distinct  values from a table in a database. The values selected from the  database table would of course depend on the various conditions that are  specified in the SQL query. Example&lt;br /&gt;SELECT DISTINCT empname FROM emptable &lt;br /&gt;Q: How to get the results of a Query sorted in any order?&lt;br /&gt;A: You  can sort the results and return the sorted results to your program by  using ORDER BY keyword thus saving you the pain of carrying out the  sorting yourself. The ORDER BY keyword is used for sorting.&lt;br /&gt;SELECT empname, age, city FROM emptable ORDER BY empname&lt;br /&gt;Q: How can I find the total number of records in a table?&lt;br /&gt;A: You could use the COUNT keyword , example&lt;br /&gt;SELECT COUNT(*) FROM emp WHERE age&amp;gt;40 &lt;br /&gt;Q: What is GROUP BY?&lt;br /&gt;A: The GROUP BY keywords have been added to  SQL because aggregate functions (like SUM) return the aggregate of all  column values every time they are called. Without the GROUP BY  functionality, finding the sum for each individual group of column  values was not possible. &lt;br /&gt;Q: What is the difference among “dropping a table”, “truncating a table” and “deleting all records” from a table.&lt;br /&gt;A: Dropping :  (Table structure  + Data are deleted), Invalidates the dependent objects ,Drops the indexes &lt;br /&gt;Truncating:  (Data alone deleted), Performs an automatic commit, Faster than delete&lt;br /&gt;Delete : (Data alone deleted), Doesn’t perform automatic commit&lt;br /&gt;Q: What are the Large object types suported by Oracle? &lt;br /&gt;A: Blob and Clob.&lt;br /&gt;Q: Difference between a “where” clause and a “having” clause.&lt;br /&gt;A: Having clause is used only with group functions whereas Where is not used with.&lt;br /&gt;Q: What’s the difference between a primary key and a unique key? &lt;br /&gt;A:  Both primary key and unique enforce uniqueness of the column on which  they are defined. But by default primary key creates a clustered index  on the column, where are unique creates a nonclustered index by default.  Another major difference is that, primary key doesn’t allow NULLs, but  unique key allows one NULL only.&lt;br /&gt;Q: What are cursors? Explain different types of cursors. What are the disadvantages of cursors? How can you avoid cursors? &lt;br /&gt;A: Cursors allow row-by-row prcessing of the resultsets.&lt;br /&gt;Types of cursors: Static, Dynamic, Forward-only, Keyset-driven. See books online for more information.&lt;br /&gt;Disadvantages  of cursors: Each time you fetch a row from the cursor, it results in a  network roundtrip, where as a normal SELECT query makes only one  rowundtrip, however large the resultset is. Cursors are also costly  because they require more resources and temporary storage (results in  more IO operations). Furthere, there are restrictions on the SELECT  statements that can be used with some types of cursors.&lt;br /&gt;Most of the times, set based operations can be used instead of cursors. &lt;br /&gt;Q: What are triggers? How to invoke a trigger on demand? &lt;br /&gt;A:  Triggers are special kind of stored procedures that get executed  automatically when an INSERT, UPDATE or DELETE operation takes place on a  table. &lt;br /&gt;Triggers can’t be invoked on demand. They get triggered only  when an associated action (INSERT, UPDATE, DELETE) happens on the table  on which they are defined.&lt;br /&gt;Triggers are generally used to implement  business rules, auditing. Triggers can also be used to extend the  referential integrity checks, but wherever possible, use constraints for  this purpose, instead of triggers, as constraints are much faster.&lt;br /&gt;Q: What is a join and explain different types of joins. &lt;br /&gt;A: Joins  are used in queries to explain how different tables are related. Joins  also let you select data from a table depending upon data from another  table. &lt;br /&gt;Types of joins: INNER JOINs, OUTER JOINs, CROSS JOINs. OUTER  JOINs are further classified as LEFT OUTER JOINS, RIGHT OUTER JOINS and  FULL OUTER JOINS.&lt;br /&gt;Q: What is a self join?&lt;br /&gt;A: Self join is just like any other join, except that two instances of the same table will be joined in the query. &lt;br /&gt;How would you find out the total number of rows in a table? &lt;br /&gt;Use SELECT COUNT(*) … in query&lt;br /&gt;How do you eliminate duplicate values in SELECT ? &lt;br /&gt;Use SELECT DISTINCT … in SQL query&lt;br /&gt;How you insert records into a table &lt;br /&gt;Using SQL INSERT statement&lt;br /&gt;How do you delete record from a table ? &lt;br /&gt;Using DELETE statement&lt;br /&gt;Example : DELETE FROM EMP&lt;br /&gt;How do you select a row using indexes? &lt;br /&gt;Specify the indexed columns in the WHERE clause of query.&lt;br /&gt;How do you find the maximum value in a column? &lt;br /&gt;Use SELECT MAX(…) .. in query&lt;br /&gt;How do you retrieve the first 5 characters of FIRSTNAME column of table EMP ? &lt;br /&gt;SELECT SUBSTR(FIRSTNAME,1,5) FROM EMP&lt;br /&gt;My SQL statement SELECT AVG(SALARY) FROM EMP yields inaccurate results. Why? &lt;br /&gt;Because SALARY is not declared to have NULLs and the employees for whom the&lt;br /&gt;salary is not known are also counted.&lt;br /&gt;How do you concatenate the FIRSTNAME and LASTNAME from EMP table to give a complete name? &lt;br /&gt;SELECT FIRSTNAME || ‘ ‘ || LASTNAME FROM EMP&lt;br /&gt;What is UNION,UNION ALL in SQL? &lt;br /&gt;UNION : eliminates duplicates&lt;br /&gt;UNION ALL: retains duplicates&lt;br /&gt;Both these are used to combine the results of different SELECT statements.&lt;br /&gt;Suppose I have five SQL SELECT statements connected by UNION/UNION ALL, how many times&lt;br /&gt;should I specify UNION to eliminate the duplicate rows? &lt;br /&gt;Once.&lt;br /&gt;In the WHERE clause what is BETWEEN and IN? &lt;br /&gt;BETWEEN supplies a range of values while IN supplies a list of values.&lt;br /&gt;Is BETWEEN inclusive of the range values specified? &lt;br /&gt;Yes.&lt;br /&gt;What is ‘LIKE’ used for in WHERE clause? What are the wildcard characters? &lt;br /&gt;LIKE is used for partial string matches. ‘%’ ( for a string of any character ) &lt;br /&gt;and ‘_’ (for any single character ) are the two wild card characters.&lt;br /&gt;When do you use a LIKE statement? &lt;br /&gt;To do partial search e.g. to search employee by name, you need not specify &lt;br /&gt;the complete name; using LIKE, you can search for partial string matches.&lt;br /&gt;Example SQL :  SELECT EMPNO FROM EMP &lt;br /&gt;WHERE EMPNAME LIKE ‘RAMESH%’&lt;br /&gt;% is used to represent remaining all characters in the name.&lt;br /&gt;This query fetches all records contains RAMESH in six characters.&lt;br /&gt;What do you accomplish by GROUP BY … HAVING clause? &lt;br /&gt;GROUP BY partitions the selected rows on the distinct values of the column on &lt;br /&gt;which you group by. HAVING selects GROUPs which match the criteria specified&lt;br /&gt;Consider the employee table with column PROJECT nullable. How can you get a list&lt;br /&gt;of employees who are not assigned to any project? &lt;br /&gt;SQL  :  SELECT EMPNO &lt;br /&gt;FROM EMP&lt;br /&gt;WHERE PROJECT IS null;&lt;br /&gt;What are the large objects supported by oracle and db2? &lt;br /&gt;Blob , Clob ( Binary Large Objects, Character Large Objects)&lt;br /&gt;What’s the difference between a primary key and a unique key? &lt;br /&gt;Primary key wont allow nulls, unique key allow nulls.&lt;br /&gt;Both Primary key and Unique key enforce the uniqueness of the column on which they are defined.&lt;br /&gt;What is a join and explain different types of joins? &lt;br /&gt;INNER JOIN&lt;br /&gt;OUTER JOIN&lt;br /&gt;LEFT OUTER JOIN&lt;br /&gt;RIGHT OUTER JOIN&lt;br /&gt;FULL OUTER JOIN&lt;br /&gt;What is a self join? &lt;br /&gt;Joining two instances of a same table. &lt;br /&gt;Sample SQL  :  SELECT A.EMPNAME , B.EMPNAME &lt;br /&gt;FROM EMP A, EMP B&lt;br /&gt;WHERE A.MGRID = B.EMPID&lt;br /&gt;What is a transaction and ACID? &lt;br /&gt;Transaction – A transaction is a logicl unint of work. All steps must be commited or rolled back.&lt;br /&gt;ACID – Atomicity, Consistency, Isolation and Duralbility, these are properties of a transaction.&lt;br /&gt;Materialized Query Tables in db2 ( This feature might not be available in oracle) ? &lt;br /&gt;Materialized Query Tables or MQTs are also known as automatic summary &lt;br /&gt;tables. A materialized query table (MQT) is a table whose definition is based upon the result of a &lt;br /&gt;query. The data that is contained in an MQT is derived from one or more tables on which the materialized &lt;br /&gt;query table definition is based.  MQT improve the query performance.  &lt;br /&gt;Sample SQL to creat MQT.&lt;br /&gt;CREATE TABLE CUSTOMER_ORDER AS &lt;br /&gt;(SELECT SUM(AMOUNT) AS TOTAL_SUM, &lt;br /&gt;TRANS_DT, &lt;br /&gt;STATUS &lt;br /&gt;FROM DB2INST2.CUSTOMER_ORDER &lt;br /&gt;WHERE TRANS_DT BETWEEN ’1/1/2001′ AND ’12/31/2001′ &lt;br /&gt;GROUP BY TRANS_DT, &lt;br /&gt;STATUS) &lt;br /&gt;DATA INITIALLY DEFERRED REFRESH DEFERRED;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-4781004042417176892?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/4781004042417176892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/01/sql-simple-questions-with-answers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/4781004042417176892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/4781004042417176892'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2011/01/sql-simple-questions-with-answers.html' title='SQL – Simple Questions with Answers'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-3551608234049787092</id><published>2010-12-29T05:41:00.000-08:00</published><updated>2010-12-29T05:41:10.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C# 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><title type='text'>Threading in C# (Part 5)</title><content type='html'>&lt;div class="sectiontitle"&gt;&lt;a href="" name="_Parallel_Programming"&gt;Part 5: Parallel Programming&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Parallel LINQ or &lt;i&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;The &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class&lt;/li&gt;&lt;li&gt;The &lt;i&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;task parallelism&lt;/a&gt;&lt;/i&gt; constructs&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections"&gt;concurrent collections&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_SpinLock_and_SpinWait"&gt;SpinLock and SpinWait&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;These APIs are collectively known (loosely) as PFX (Parallel Framework). The &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class together with the &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;task parallelism constructs&lt;/a&gt; is called the &lt;i&gt;Task Parallel Library&lt;/i&gt; or TPL.&lt;br /&gt;Framework 4.0 also adds a number of lower-level threading constructs that are aimed equally at traditional multithreading. We covered these previously:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The low-latency signaling constructs (&lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Semaphore"&gt;SemaphoreSlim&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_ManualResetEvent"&gt;ManualResetEventSlim&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_CountdownEvent"&gt;CountdownEvent&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part4.aspx#_The_Barrier_Class"&gt;Barrier&lt;/a&gt;&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;   &lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;Cancellation tokens&lt;/a&gt; for cooperative cancellation&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.albahari.com/threading/part3.aspx#_Lazy_Initialization"&gt;lazy initialization classes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;   &lt;code&gt;    &lt;a href="http://www.albahari.com/threading/part3.aspx#_ThreadLocalT"&gt;ThreadLocal&lt;t&gt;&lt;/t&gt;&lt;/a&gt;   &lt;/code&gt;  &lt;/li&gt;&lt;/ul&gt;You’ll need to be comfortable with the fundamentals in Parts 1-4 before continuing — particularly &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt; and &lt;a href="http://www.albahari.com/threading/part2.aspx#_Thread_Safety"&gt;thread safety&lt;/a&gt;.&lt;br /&gt;&lt;div class="note"&gt;All the code listings in the parallel programming sections are available as interactive samples in &lt;a href="http://www.linqpad.net/"&gt;LINQPad&lt;/a&gt;.  To access these samples, click &lt;i&gt;Download More Samples&lt;/i&gt; in LINQPad's Samples tab in the bottom left, and select &lt;i&gt;C# 4.0 in a Nutshell: More Chapters&lt;/i&gt;.&lt;/div&gt;&lt;h1&gt;  &lt;a href="" name="_Why_PFX"&gt;Why PFX?&lt;/a&gt; &lt;/h1&gt;In recent times, CPU clock speeds have stagnated and manufacturers have shifted their focus to increasing core counts. This is problematic for us as programmers because our standard single-threaded code will not automatically run faster as a result of those extra cores.&lt;br /&gt;Leveraging multiple cores is easy for most server applications, where each thread can independently handle a separate client request, but is harder on the desktop — because it typically requires that you take your computationally intensive code and do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;   &lt;em&gt;Partition&lt;/em&gt; it into small chunks.&lt;/li&gt;&lt;li&gt;Execute those chunks in parallel via multithreading.&lt;/li&gt;&lt;li&gt;   &lt;em&gt;Collate&lt;/em&gt; the results as they become available, in a thread-safe and performant manner.&lt;/li&gt;&lt;/ol&gt;Although you can do all of this with the classic multithreading constructs, it’s awkward — particularly the steps of partitioning and collating. A further problem is that the usual strategy of &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt; for &lt;a href="http://www.albahari.com/threading/part2.aspx#_Thread_Safety"&gt;thread safety&lt;/a&gt; causes a lot of contention when many threads work on the same data at once.&lt;br /&gt;The PFX libraries have been designed specifically to help in these scenarios.&lt;br /&gt;&lt;div class="note"&gt;Programming to leverage multicores or multiple processors is called &lt;i&gt;parallel programming&lt;/i&gt;. This is a subset of the broader concept of multithreading.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_PFX_Concepts"&gt;PFX Concepts&lt;/a&gt; &lt;/h2&gt;There are two strategies for partitioning work among threads: &lt;i&gt;data parallelism&lt;/i&gt; and &lt;i&gt;task parallelism&lt;/i&gt;.&lt;br /&gt;When a set of tasks must be performed on many data values, we can parallelize by having each thread perform the (same) set of tasks on a subset of values. This is called &lt;i&gt;data parallelism&lt;/i&gt; because we are partitioning the &lt;em&gt;data&lt;/em&gt; between threads. In contrast, with &lt;i&gt;task parallelism&lt;/i&gt; we partition the &lt;em&gt;tasks&lt;/em&gt;; in other words, we have each thread perform a different task.&lt;br /&gt;In general, data parallelism is easier and scales better to highly parallel hardware, because it reduces or eliminates shared data (thereby reducing contention and thread-safety issues). Also, data parallelism leverages the fact that there are often more data values than discrete tasks, increasing the parallelism potential.&lt;br /&gt;Data parallelism is also conducive to &lt;i&gt;structured parallelism&lt;/i&gt;, which means that parallel work units start and finish in the same place in your program. In contrast, task parallelism tends to be unstructured, meaning that parallel work units may start and finish in places scattered across your program. Structured parallelism is simpler and less error-prone and allows you to farm the difficult job of partitioning and thread coordination (and even result collation) out to libraries.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_PFX_Components"&gt;PFX Components&lt;/a&gt; &lt;/h2&gt;PFX comprises two layers of functionality. The higher layer consists of two &lt;em&gt;structured data parallelism&lt;/em&gt; APIs: &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt; and the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class. The lower layer contains the task parallelism classes — plus a set of additional constructs to help with parallel programming activities.&lt;br /&gt;&lt;div class="figure"&gt;  &lt;img alt="Parallel Programming Components" height="473" src="http://www.albahari.com/threading/ParallelProgramming.png" width="750" /&gt; &lt;/div&gt;PLINQ offers the richest functionality: it automates all the steps of parallelization — including partitioning the work into tasks, executing those tasks on threads, and collating the results into a single output sequence. It’s called &lt;em&gt;declarative&lt;/em&gt; — because you simply declare that you want to parallelize your work (which you structure as a LINQ query), and let the Framework take care of the implementation details. In contrast, the other approaches are &lt;em&gt;imperative&lt;/em&gt;, in that you need to explicitly write code to partition or collate. In the case of the &lt;code&gt;Parallel&lt;/code&gt; class, you must collate results yourself; with the task parallelism constructs, you must partition the work yourself, too:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;th valign="top"&gt;&lt;br /&gt;&lt;/th&gt;   &lt;th valign="top"&gt;Partitions work&lt;/th&gt;   &lt;th valign="top"&gt;Collates results&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;Yes&lt;/td&gt;   &lt;td valign="top"&gt;Yes&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;The &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class&lt;/td&gt;   &lt;td valign="top"&gt;Yes&lt;/td&gt;   &lt;td valign="top"&gt;No&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;PFX’s &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;task parallelism&lt;/a&gt;&lt;/td&gt;   &lt;td valign="top"&gt;No&lt;/td&gt;   &lt;td valign="top"&gt;No&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The &lt;a href="http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections"&gt;concurrent collections&lt;/a&gt; and &lt;a href="http://www.albahari.com/threading/part5.aspx#_SpinLock_and_SpinWait"&gt;spinning primitives&lt;/a&gt; help you with lower-level parallel programming activities. These are important because PFX has been designed to work not only with today’s hardware, but also with future generations of processors with far more cores. If you want to move a pile of chopped wood and you have 32 workers to do the job, the biggest challenge is moving the wood without the workers getting in each other's way. It’s the same with dividing an algorithm among 32 cores: if ordinary locks are used to protect common resources, the resultant &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;blocking&lt;/a&gt; may mean that only a fraction of those cores are ever actually busy at once. The concurrent collections are tuned specifically for highly concurrent access, with the focus on minimizing or eliminating blocking. PLINQ and the &lt;code&gt;Parallel&lt;/code&gt; class themselves rely on the concurrent collections and on spinning primitives for efficient management of work.&lt;br /&gt;&lt;div class="sidebar"&gt; &lt;div class="sidebartitle"&gt;PFX and Traditional Multithreading&lt;/div&gt;A traditional multithreading scenario is one where multithreading can be of benefit even on a single-core machine — with no true &lt;em&gt;parallelization&lt;/em&gt; taking place. We covered these previously: they include such tasks as maintaining a responsive user interface and downloading two web pages at once.&lt;br /&gt;Some of the constructs that we’ll cover in the parallel programming sections are also sometimes useful in traditional multithreading. In particular:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt; and the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class are useful whenever you want to execute operations in parallel and then wait for them to complete (&lt;em&gt;structured&lt;/em&gt; parallelism). This includes non-CPU-intensive tasks such as calling a web service.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;task parallelism constructs&lt;/a&gt; are useful when you want to run some operation on a &lt;a href="http://www.albahari.com/threading/#_Thread_Pooling"&gt;pooled thread&lt;/a&gt;, and also to manage a task’s workflow through &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuations&lt;/a&gt; and &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;parent/child tasks&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections"&gt;concurrent collections&lt;/a&gt; are sometimes appropriate when you want a thread-safe queue, stack, or dictionary.&lt;/li&gt;&lt;li&gt;   &lt;a href="http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT"&gt;BlockingCollection&lt;/a&gt; provides an easy means to implement &lt;a href="http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_Queue"&gt;producer/consumer&lt;/a&gt; structures.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_When_to_Use_PFX"&gt;When to Use PFX&lt;/a&gt; &lt;/h2&gt;The primary use case for PFX is &lt;em&gt;parallel programming&lt;/em&gt;: leveraging multicore processors to speed up computationally intensive code.&lt;br /&gt;A challenge in leveraging multicores is Amdahl's law, which states that the maximum performance improvement from parallelization is governed by the portion of the code that must execute sequentially. For instance, if only two-thirds of an algorithm’s execution time is parallelizable, you can never exceed a threefold performance gain — even with an infinite number of cores.&lt;br /&gt;So, before proceeding, it’s worth verifying that the bottleneck is in parallelizable code. It’s also worth considering whether your code &lt;em&gt;needs&lt;/em&gt; to be computationally intensive — optimization is often the easiest and most effective approach. There’s a trade-off, though, in that some optimization techniques can make it harder to parallelize code.&lt;br /&gt;The easiest gains come with what’s called &lt;i&gt;embarrassingly parallel&lt;/i&gt; problems — where a job can be divided easily into tasks that execute efficiently on their own (structured parallelism is very well suited to such problems). Examples include many image processing tasks, ray tracing, and brute force approaches in mathematics or cryptography. An example of a nonembarrassingly parallel problem is implementing an optimized version of the quicksort algorithm — a good result takes some thought and may require unstructured parallelism.&lt;br /&gt;&lt;h1&gt;  &lt;a href="" name="_PLINQ"&gt;PLINQ&lt;/a&gt; &lt;/h1&gt;PLINQ automatically parallelizes local LINQ queries. PLINQ has the advantage of being easy to use in that it offloads the burden of both work partitioning and result collation to the Framework.&lt;br /&gt;To use PLINQ, simply call &lt;code&gt;AsParallel()&lt;/code&gt; on the input sequence and then continue the LINQ query as usual. The following query calculates the prime numbers between 3 and 100,000 — making full use of all cores on the target machine:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_comment"&gt;// Calculate prime numbers using a simple (unoptimized) algorithm.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;IEnumerable&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100000-3&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;parallelQuery &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;br /&gt;&amp;nbsp; from n &lt;span class="sh_keyword"&gt;in&lt;/span&gt; numbers&lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;where&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n&lt;span class="sh_symbol"&gt;)).&lt;/span&gt;&lt;span class="sh_function"&gt;All&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;%&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;select&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;n&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; primes &lt;span class="sh_symbol"&gt;=&lt;/span&gt; parallelQuery&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;AsParallel&lt;/code&gt; is an extension method in &lt;code&gt;System.Linq.ParallelEnumerable&lt;/code&gt;. It wraps the input in a sequence based on &lt;code&gt;ParallelQuery&lt;tsource&gt;&lt;/tsource&gt;&lt;/code&gt;, which causes the LINQ query operators that you subsequently call to bind to an alternate set of extension methods defined in &lt;code&gt;ParallelEnumerable&lt;/code&gt;. These provide parallel implementations of each of the standard query operators. Essentially, they work by partitioning the input sequence into chunks that execute on different threads, collating the results back into a single output sequence for consumption:&lt;br /&gt;&lt;div class="figure"&gt;  &lt;img alt="PLINQ Execution" height="298" src="http://www.albahari.com/threading/PLINQExecution.png" width="750" /&gt; &lt;/div&gt;Calling &lt;code&gt;AsSequential()&lt;/code&gt; unwraps a &lt;code&gt;ParallelQuery&lt;/code&gt; sequence so that subsequent query operators bind to the standard query operators and execute sequentially. This is necessary before calling methods that have side effects or are not thread-safe.&lt;br /&gt;For query operators that accept two input sequences (&lt;code&gt;Join&lt;/code&gt;, &lt;code&gt;GroupJoin&lt;/code&gt;, &lt;code&gt;Concat&lt;/code&gt;, &lt;code&gt;Union&lt;/code&gt;, &lt;code&gt;Intersect&lt;/code&gt;, &lt;code&gt;Except&lt;/code&gt;, and &lt;code&gt;Zip&lt;/code&gt;), you must apply &lt;code&gt;AsParallel()&lt;/code&gt; to both input sequences (otherwise, an exception is thrown). You don’t, however, need to keep applying &lt;code&gt;AsParallel&lt;/code&gt; to a query as it progresses, because PLINQ’s query operators output another &lt;code&gt;ParallelQuery&lt;/code&gt; sequence. In fact, calling &lt;code&gt;AsParallel&lt;/code&gt; again introduces inefficiency in that it forces merging and repartitioning of the query:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;mySequence&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Wraps sequence in ParallelQuery&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Where&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Outputs another ParallelQuery&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;br /&gt;          &lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Unnecessary - and inefficient!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/pre&gt;Not all query operators can be effectively parallelized. For &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ_Limitations"&gt;those that cannot&lt;/a&gt;, PLINQ implements the operator sequentially instead. PLINQ may also operate sequentially if it suspects that the overhead of parallelization will actually slow a particular query.&lt;br /&gt;PLINQ is only for local collections: it doesn’t work with LINQ to SQL or Entity Framework because in those cases the LINQ translates into SQL which then executes on a database server. However, you &lt;em&gt;can&lt;/em&gt; use PLINQ to perform additional local querying on the result sets obtained from database queries.&lt;br /&gt;&lt;div class="warning"&gt;If a PLINQ query throws an exception, it’s rethrown as an &lt;code&gt;AggregateException&lt;/code&gt; whose &lt;code&gt;InnerExceptions&lt;/code&gt; property contains the real exception (or exceptions). See &lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;Working with AggregateException&lt;/a&gt; for details.&lt;/div&gt;&lt;div class="sidebar"&gt; &lt;div class="sidebartitle"&gt;Why Isn’t AsParallel the Default?&lt;/div&gt;Given that &lt;code&gt;AsParallel&lt;/code&gt; transparently parallelizes LINQ queries, the question arises, “Why didn’t Microsoft simply parallelize the standard query operators and make PLINQ the default?”&lt;br /&gt;There are a number of reasons for the &lt;em&gt;opt-in&lt;/em&gt; approach. First, for PLINQ to be useful there has to be a reasonable amount of computationally intensive work for it to farm out to worker threads. Most LINQ to Objects queries execute very quickly, and not only would parallelization be unnecessary, but the overhead of partitioning, collating, and coordinating the extra threads may actually slow things down.&lt;br /&gt;Additionally:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The output of a PLINQ query (by default) may &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ_and_Ordering"&gt;differ from a LINQ query&lt;/a&gt; with respect to element ordering.&lt;/li&gt;&lt;li&gt;PLINQ wraps exceptions in an &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;AggregateException&lt;/a&gt;&lt;/code&gt; (to handle the possibility of multiple exceptions being thrown).&lt;/li&gt;&lt;li&gt;PLINQ will give unreliable results if the query invokes thread-unsafe methods.&lt;/li&gt;&lt;/ul&gt;Finally, PLINQ offers quite a few hooks for tuning and tweaking. Burdening the standard LINQ to Objects API with such nuances would add distraction.&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Parallel_Execution_Ballistics"&gt;Parallel Execution Ballistics&lt;/a&gt; &lt;/h2&gt;Like ordinary LINQ queries, PLINQ queries are lazily evaluated. This means that execution is triggered only when you begin consuming the results — typically via a &lt;code&gt;foreach&lt;/code&gt; loop (although it may also be via a conversion operator such as &lt;code&gt;ToArray&lt;/code&gt; or an operator that returns a single element or value).&lt;br /&gt;As you enumerate the results, though, execution proceeds somewhat differently from that of an ordinary sequential query. A sequential query is powered entirely by the consumer in a “pull” fashion: each element from the input sequence is fetched exactly when required by the consumer. A parallel query ordinarily uses independent threads to fetch elements from the input sequence slightly &lt;em&gt;ahead&lt;/em&gt; of when they’re needed by the consumer (rather like a teleprompter for newsreaders, or an antiskip buffer in CD players). It then processes the elements in parallel through the query chain, holding the results in a small buffer so that they’re ready for the consumer on demand. If the consumer pauses or breaks out of the enumeration early, the query processor also pauses or stops so as not to waste CPU time or memory.&lt;br /&gt;&lt;div class="note"&gt;You can tweak PLINQ’s buffering behavior by calling &lt;code&gt;WithMergeOptions&lt;/code&gt; after &lt;code&gt;AsParallel&lt;/code&gt;. The default value of &lt;code&gt;AutoBuffered&lt;/code&gt; generally gives the best overall results. &lt;code&gt;NotBuffered&lt;/code&gt; disables the buffer and is useful if you want to see results as soon as possible; &lt;code&gt;FullyBuffered&lt;/code&gt; caches the entire result set before presenting it to the consumer (the &lt;code&gt;OrderBy&lt;/code&gt; and &lt;code&gt;Reverse&lt;/code&gt; operators naturally work this way, as do the element, aggregation, and conversion operators).&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_PLINQ_and_Ordering"&gt;PLINQ and Ordering&lt;/a&gt; &lt;/h2&gt;A side effect of parallelizing the query operators is that when the results are collated, it’s not necessarily in the same order that they were submitted, as illustrated in the previous diagram. In other words, LINQ’s normal order-preservation guarantee for sequences no longer holds.&lt;br /&gt;If you need order preservation, you can force it by calling &lt;code&gt;AsOrdered()&lt;/code&gt; after &lt;code&gt;AsParallel()&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;myCollection&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;AsOrdered&lt;/span&gt;&lt;span class="sh_symbol"&gt;()...&lt;/span&gt;&lt;/pre&gt;Calling &lt;code&gt;AsOrdered&lt;/code&gt; incurs a performance hit with large numbers of elements because PLINQ must keep track of each element’s original position.&lt;br /&gt;You can negate the effect of &lt;code&gt;AsOrdered&lt;/code&gt; later in a query by calling &lt;code&gt;AsUnordered&lt;/code&gt;: this introduces a “random shuffle point” which allows the query to execute more efficiently from that point on. So if you wanted to preserve input-sequence ordering for just the first two query operators, you’d do this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;inputSequence&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsOrdered&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;i&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;QueryOperator1&lt;/span&gt;&lt;/i&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;QueryOperator2&lt;/span&gt;&lt;/i&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsUnordered&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// From here on, ordering doesn’t matter&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;i&gt;&lt;span class="sh_function"&gt;QueryOperator3&lt;/span&gt;&lt;/i&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;AsOrdered&lt;/code&gt; is not the default because for most queries, the original input ordering doesn’t matter. In other words, if &lt;code&gt;AsOrdered&lt;/code&gt; was the default, you’d have to apply &lt;code&gt;AsUnordered&lt;/code&gt; to the majority of your parallel queries to get the best performance, which would be burdensome.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_PLINQ_Limitations"&gt;PLINQ Limitations&lt;/a&gt; &lt;/h2&gt;There are currently some practical limitations on what PLINQ can parallelize. These limitations may loosen with subsequent service packs and Framework versions.&lt;br /&gt;The following query operators prevent a query from being parallelized, unless the source elements are in their original indexing position:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   &lt;code&gt;Take&lt;/code&gt;, &lt;code&gt;TakeWhile&lt;/code&gt;, &lt;code&gt;Skip&lt;/code&gt;, and &lt;code&gt;SkipWhile&lt;/code&gt;&lt;/li&gt;&lt;li&gt;The indexed versions of &lt;code&gt;Select&lt;/code&gt;, &lt;code&gt;SelectMany&lt;/code&gt;, and &lt;code&gt;ElementAt&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;Most query operators change the indexing position of elements (including those that remove elements, such as &lt;code&gt;Where&lt;/code&gt;). This means that if you want to use the preceding operators, they’ll usually need to be at the start of the query.&lt;br /&gt;The following query operators are parallelizable, but use an expensive partitioning strategy that can sometimes be slower than sequential processing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   &lt;code&gt;Join&lt;/code&gt;, &lt;code&gt;GroupBy&lt;/code&gt;, &lt;code&gt;GroupJoin&lt;/code&gt;, &lt;code&gt;Distinct&lt;/code&gt;, &lt;code&gt;Union&lt;/code&gt;, &lt;code&gt;Intersect&lt;/code&gt;, and &lt;code&gt;Except&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;The &lt;code&gt;Aggregate&lt;/code&gt; operator’s &lt;em&gt;seeded&lt;/em&gt; overloads in their standard incarnations are not parallelizable — PLINQ provides &lt;a href="http://www.albahari.com/threading/part5.aspx#_Optimizing_PLINQ"&gt;special overloads&lt;/a&gt; to deal with this.&lt;br /&gt;All other operators are parallelizable, although use of these operators doesn’t guarantee that your query will be parallelized. PLINQ may run your query sequentially if it suspects that the overhead of parallelization will slow down that particular query. You can override this behavior and force parallelism by calling the following after &lt;code&gt;AsParallel()&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;.WithExecutionMode (ParallelExecutionMode.ForceParallelism)&lt;/pre&gt;&lt;h2&gt;  &lt;a href="" name="_PLINQ_Spellchecker"&gt;Example: Parallel Spellchecker&lt;/a&gt; &lt;/h2&gt;Suppose we want to write a spellchecker that runs quickly with very large documents by leveraging all available cores. By formulating our algorithm into a LINQ query, we can very easily parallelize it.&lt;br /&gt;The first step is to download a dictionary of English words into a &lt;code&gt;HashSet&lt;/code&gt; for efficient lookup:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;File&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Exists&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Contains about 150,000 words&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadFile&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_string"&gt;"http://www.albahari.com/ispell/allwords.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;wordLookup &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; HashSet&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; File&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ReadAllLines&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;br /&gt;&amp;nbsp; StringComparer&lt;span class="sh_symbol"&gt;.&lt;/span&gt;InvariantCultureIgnoreCase&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;We’ll then use our word lookup to create a test “document” comprising an array of a million random words. After building the array, we’ll introduce a couple of spelling mistakes: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;random &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Random&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;=&lt;/span&gt; wordLookup&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordsToTest &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;[&lt;/span&gt;random&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Next&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; wordList&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Length&lt;span class="sh_symbol"&gt;)])&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;wordsToTest &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;12345&lt;/span&gt;&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_string"&gt;"woozsh"&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Introduce a couple&lt;/span&gt;&lt;br /&gt;wordsToTest &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;23456&lt;/span&gt;&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_string"&gt;"wubsie"&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// of spelling mistakes.&lt;/span&gt;&lt;/pre&gt;Now we can perform our parallel spellcheck by testing &lt;code&gt;wordsToTest&lt;/code&gt; against &lt;code&gt;wordLookup&lt;/code&gt;. PLINQ makes this very easy:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; wordsToTest&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;Select &amp;nbsp;&lt;span class="sh_symbol"&gt;((&lt;/span&gt;word&lt;span class="sh_symbol"&gt;,&lt;/span&gt; index&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; IndexedWord &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Word&lt;span class="sh_symbol"&gt;=&lt;/span&gt;word&lt;span class="sh_symbol"&gt;,&lt;/span&gt; Index&lt;span class="sh_symbol"&gt;=&lt;/span&gt;index &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;Where &amp;nbsp;&amp;nbsp;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;iword &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;!&lt;/span&gt;wordLookup&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Contains&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;iword&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Word&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;OrderBy&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;iword &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; iword&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Index&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;query&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Dump&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;     &lt;span class="sh_comment"&gt;// Display output in LINQPad&lt;/span&gt;&lt;/pre&gt;Here's the output, as displayed in LINQPad:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="linqpad"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td class="typeheader" colspan="2"&gt;    OrderedParallelQuery&lt;indexedword&gt; (2 items)   &lt;/indexedword&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;th title="System.String"&gt;Word&lt;/th&gt;   &lt;th title="System.Int32"&gt;Index&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;woozsh&lt;/td&gt;   &lt;td&gt;12345&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;wubsie&lt;/td&gt;   &lt;td&gt;23456&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;code&gt;IndexedWord&lt;/code&gt; is a custom struct that we define as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;struct&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;IndexedWord&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;string&lt;/span&gt; Word&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; Index&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;The &lt;code&gt;wordLookup.Contains&lt;/code&gt; method in the predicate gives the query some “meat” and makes it worth parallelizing.&lt;br /&gt;&lt;div class="note"&gt;  We could simplify the query slightly by using an anonymous type instead of the &lt;code&gt;IndexedWord&lt;/code&gt; struct. However, this would degrade performance because anonymous types (being classes and therefore reference types) incur the cost of heap-based allocation and subsequent garbage collection. &lt;br /&gt;The difference might not be enough to matter with sequential queries, but with parallel queries, favoring stack-based allocation can be quite advantageous. This is because stack-based allocation is highly parallelizable (as each thread has its own stack), whereas all threads must compete for the same heap — managed by a single memory manager and garbage collector.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;  &lt;a href="" name="_Using_ThreadLocal"&gt;Using ThreadLocal&lt;t&gt;&lt;/t&gt;&lt;/a&gt; &lt;/h3&gt;Let’s extend our example by parallelizing the creation of the random test-word list itself. We structured this as a LINQ query, so it should be easy. Here’s the sequential version:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordsToTest &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;b&gt;random&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Next&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; wordList&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Length&lt;span class="sh_symbol"&gt;)])&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;Unfortunately, the call to &lt;code&gt;random.Next&lt;/code&gt; is not thread-safe, so it’s not as simple as inserting &lt;code&gt;AsParallel()&lt;/code&gt; into the query. A potential solution is to write a function that locks around &lt;code&gt;random.Next&lt;/code&gt;; however, this would limit concurrency. The better option is to use &lt;a href="http://www.albahari.com/threading/part3.aspx#_Thread-Local_Storage"&gt;ThreadLocal&lt;random&gt;&lt;/random&gt;&lt;/a&gt; to create a separate &lt;code&gt;Random&lt;/code&gt; object for each thread. We can then parallelize the query as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;localRandom &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; ThreadLocal&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Random&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="sh_symbol"&gt;(&lt;/span&gt; &lt;b&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Random&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Guid&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;NewGuid&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;GetHashCode&lt;/span&gt;&lt;span class="sh_symbol"&gt;())&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordsToTest &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;b&gt;localRandom&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Value&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Next&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; wordList&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Length&lt;span class="sh_symbol"&gt;)])&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;In our factory function for instantiating a &lt;code&gt;Random&lt;/code&gt; object, we pass in a &lt;code&gt;Guid&lt;/code&gt;’s hashcode to ensure that if two &lt;code&gt;Random&lt;/code&gt; objects are created within a short period of time, they’ll yield different random number sequences.&lt;br /&gt;&lt;div class="sidebar"&gt; &lt;div class="sidebartitle"&gt;When to Use PLINQ&lt;/div&gt;It’s tempting to search your existing applications for LINQ queries and experiment with parallelizing them. This is usually unproductive, because most problems for which LINQ is obviously the best solution tend to execute very quickly and so don’t benefit from parallelization. A better approach is to find a CPU-intensive bottleneck and then consider, “Can this be expressed as a LINQ query?” (A welcome side effect of such restructuring is that LINQ typically makes code smaller and more readable.)&lt;br /&gt;PLINQ is well suited to embarrassingly parallel problems. It also works well for structured blocking tasks, such as calling several web services at once (see &lt;a href="http://www.albahari.com/threading/part5.aspx#_Calling_Blocking_Functions_PLINQ"&gt;Calling Blocking or I/O-Intensive Functions&lt;/a&gt;).&lt;br /&gt;PLINQ can be a poor choice for imaging, because collating millions of pixels into an output sequence creates a bottleneck. Instead, it’s better to write pixels directly to an array or unmanaged memory block and use the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class or &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;task parallelism&lt;/a&gt; to manage the multithreading. (It is possible, however, to defeat result collation using &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Output-side_optimization"&gt;ForAll&lt;/a&gt;&lt;/code&gt;. Doing so makes sense if the image processing algorithm naturally lends itself to LINQ.)&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Functional_Purity"&gt;Functional Purity&lt;/a&gt; &lt;/h2&gt;Because PLINQ runs your query on parallel threads, you must be careful not to perform thread-unsafe operations. In particular, writing to variables is &lt;em&gt;side-effecting&lt;/em&gt; and therefore thread-unsafe:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_comment"&gt;// The following query multiplies each element by its position.&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_comment"&gt;// Given an input of Enumerable.Range(0,999), it should output squares.&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; from n &lt;span class="sh_keyword"&gt;in&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_number"&gt;999&lt;/span&gt;&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_usertype"&gt;select&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; &lt;b&gt;i&lt;span class="sh_symbol"&gt;++&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;We could make incrementing &lt;code&gt;i&lt;/code&gt; thread-safe by using locks or &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part4.aspx#_Interlocked"&gt;Interlocked&lt;/a&gt;&lt;/code&gt;, but the problem would still remain that &lt;code&gt;i&lt;/code&gt; won’t necessarily correspond to the position of the input element. And adding &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ_and_Ordering"&gt;AsOrdered&lt;/a&gt;&lt;/code&gt; to the query wouldn’t fix the latter problem, because &lt;code&gt;AsOrdered&lt;/code&gt; ensures only that the elements are output in an order consistent with them having been processed sequentially — it doesn’t actually &lt;em&gt;process&lt;/em&gt; them sequentially.&lt;br /&gt;Instead, this query should be rewritten to use the indexed version of &lt;code&gt;Select&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_number"&gt;999&lt;/span&gt;&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;n&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; i&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;For best performance, any methods called from query operators should be thread-safe by virtue of not writing to fields or properties (non-side-effecting, or &lt;i&gt;functionally pure&lt;/i&gt;). If they’re thread-safe by virtue of &lt;em&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt;&lt;/em&gt;, the query’s parallelism potential will be limited — by the duration of the lock divided by the total time spent in that function.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Calling_Blocking_Functions_PLINQ"&gt;Calling Blocking or I/O-Intensive Functions&lt;/a&gt; &lt;/h2&gt;Sometimes a query is long-running not because it’s CPU-intensive, but because it &lt;em&gt;waits&lt;/em&gt; on something — such as a web page to download or some hardware to respond. PLINQ can effectively parallelize such queries, providing that you hint it by calling &lt;code&gt;WithDegreeOfParallelism&lt;/code&gt; after &lt;code&gt;AsParallel&lt;/code&gt;. For instance, suppose we want to ping six websites simultaneously. Rather than using clumsy &lt;a href="http://www.albahari.com/threading/#_Asynchronous_delegates"&gt;asynchronous delegates&lt;/a&gt; or manually spinning up six threads, we can accomplish this effortlessly with a PLINQ query:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;from site &lt;span class="sh_keyword"&gt;in&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"www.albahari.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"www.linqpad.net"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"www.oreilly.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"www.google.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"www.takeonit.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_string"&gt;"stackoverflow.com"&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WithDegreeOfParallelism&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;6&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;let&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;p &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Ping&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Send&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;site&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;select &lt;span class="sh_keyword"&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; site&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Result &lt;span class="sh_symbol"&gt;=&lt;/span&gt; p&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Status&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Time &lt;span class="sh_symbol"&gt;=&lt;/span&gt; p&lt;span class="sh_symbol"&gt;.&lt;/span&gt;RoundtripTime&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;WithDegreeOfParallelism&lt;/code&gt; forces PLINQ to run the specified number of tasks simultaneously. This is necessary when calling &lt;em&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;blocking&lt;/a&gt;&lt;/em&gt; functions such as &lt;code&gt;Ping.Send&lt;/code&gt; because PLINQ otherwise assumes that the query is CPU-intensive and allocates tasks accordingly. On a two-core machine, for instance, PLINQ may default to running only two tasks at once, which is clearly undesirable in this situation.&lt;br /&gt;&lt;div class="note"&gt;PLINQ typically serves each task with a thread, subject to allocation by the &lt;a href="http://www.albahari.com/threading/#_Thread_Pooling"&gt;thread pool&lt;/a&gt;. You can accelerate the initial ramping up of threads by calling &lt;code&gt;&lt;a href="http://www.albahari.com/threading/#_Optimizing_the_Thread_Pool"&gt;ThreadPool.SetMinThreads&lt;/a&gt;&lt;/code&gt;. &lt;/div&gt;To give another example, suppose we were writing a surveillance system and wanted to repeatedly combine images from four security cameras into a single composite image for display on a CCTV. We’ll represent a camera with the following class:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Camera&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; CameraID&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;Camera&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; cameraID&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; CameraID &lt;span class="sh_symbol"&gt;=&lt;/span&gt; cameraID&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Get image from camera: return a simple string rather than an image&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;string&lt;/span&gt; &lt;span class="sh_function"&gt;GetNextFrame&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sleep&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// Simulate time taken to get snapshot&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;span class="sh_string"&gt;"Frame from camera "&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; CameraID&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;To obtain a composite image, we must call &lt;code&gt;GetNextFrame&lt;/code&gt; on each of four camera objects. Assuming the operation is I/O-bound, we can quadruple our frame rate with parallelization — even on a single-core machine. PLINQ makes this possible with minimal programming effort:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Camera&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; cameras &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Create 4 camera objects.&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Camera&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; data &lt;span class="sh_symbol"&gt;=&lt;/span&gt; cameras&lt;br /&gt;    &lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;AsOrdered&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;WithDegreeOfParallelism&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; c&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;GetNextFrame&lt;/span&gt;&lt;span class="sh_symbol"&gt;()).&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Join&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;", "&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; data&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Display data...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;GetNextFrame&lt;/code&gt; is a &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;blocking&lt;/a&gt; method, so we used &lt;code&gt;WithDegreeOfParallelism&lt;/code&gt; to get the desired concurrency. In our example, the blocking happens when we call &lt;code&gt;Sleep&lt;/code&gt;; in real life it would block because fetching an image from a camera is I/O- rather than CPU-intensive.&lt;br /&gt;&lt;div class="note"&gt;Calling &lt;code&gt;AsOrdered&lt;/code&gt; ensures the images are displayed in a consistent order. Because there are only four elements in the sequence, this would have a negligible effect on performance.&lt;/div&gt;&lt;h3&gt;Changing the degree of parallelism&lt;/h3&gt;You can call &lt;code&gt;WithDegreeOfParallelism&lt;/code&gt; only once within a PLINQ query. If you need to call it again, you must force merging and repartitioning of the query by calling &lt;code&gt;IsParallel()&lt;/code&gt; again within the query:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_string"&gt;"The Quick Brown Fox"&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;WithDegreeOfParallelism&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Where&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;!&lt;/span&gt;&lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;IsWhiteSpace&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;WithDegreeOfParallelism&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Forces Merge + Partition&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToUpper&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;/pre&gt;&lt;h2&gt;  &lt;a href="" name="_PLINQ_Cancellation"&gt;Cancellation&lt;/a&gt; &lt;/h2&gt;Canceling a PLINQ query whose results you’re consuming in a &lt;code&gt;foreach&lt;/code&gt; loop is easy: simply break out of the &lt;code&gt;foreach&lt;/code&gt; and the query will be automatically canceled as the enumerator is implicitly disposed.&lt;br /&gt;For a query that terminates with a conversion, element, or aggregation operator, you can cancel it from another thread via a &lt;i&gt;&lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;cancellation token&lt;/a&gt;&lt;/i&gt;. To insert a token, call &lt;code&gt;WithCancellation&lt;/code&gt; after calling &lt;code&gt;AsParallel&lt;/code&gt;, passing in the &lt;code&gt;Token&lt;/code&gt; property of a &lt;code&gt;CancellationTokenSource&lt;/code&gt; object. Another thread can then call &lt;code&gt;Cancel&lt;/code&gt; on the token source, which throws an &lt;code&gt;OperationCanceledException&lt;/code&gt; on the query’s consumer:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;IEnumerable&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;million &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;cancelSource &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;primeNumberQuery &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;br /&gt;&amp;nbsp; from n &lt;span class="sh_keyword"&gt;in&lt;/span&gt; million&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WithCancellation&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;cancelSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Token&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;where&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n&lt;span class="sh_symbol"&gt;)).&lt;/span&gt;&lt;span class="sh_function"&gt;All&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;%&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;select&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;n&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Thread&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&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; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sleep&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Cancel query after&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; &lt;b&gt;cancelSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Cancel&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 100 milliseconds.&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; &lt;span class="sh_cbracket"&gt;}&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; &lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;Start&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Start query running:&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; primes &lt;span class="sh_symbol"&gt;=&lt;/span&gt; primeNumberQuery&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// We'll never get here because the other thread will cancel us.&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;b&gt;OperationCanceledException&lt;/b&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Query canceled"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;PLINQ doesn’t preemptively abort threads, because of the &lt;a href="http://www.albahari.com/threading/part4.aspx#_Aborting_Threads"&gt;danger of doing so&lt;/a&gt;. Instead, upon cancellation it waits for each worker thread to finish with its current element before ending the query. This means that any external methods that the query calls will run to completion.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Optimizing_PLINQ"&gt;Optimizing PLINQ&lt;/a&gt; &lt;/h2&gt;&lt;h3&gt;  &lt;a href="" name="_Output-side_optimization"&gt;Output-side optimization&lt;/a&gt; &lt;/h3&gt;One of PLINQ’s advantages is that it conveniently collates the results from parallelized work into a single output sequence. Sometimes, though, all that you end up doing with that sequence is running some function once over each element:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; n &lt;span class="sh_keyword"&gt;in&lt;/span&gt; parallelQuery&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_function"&gt;DoSomething&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;If this is the case — and you don’t care about the order in which the elements are processed — you can improve efficiency with PLINQ’s &lt;code&gt;ForAll&lt;/code&gt; method.&lt;br /&gt;The &lt;code&gt;ForAll&lt;/code&gt; method runs a delegate over every output element of a &lt;code&gt;ParallelQuery&lt;/code&gt;. It hooks right into PLINQ’s internals, bypassing the steps of collating and enumerating the results. To give a trivial example:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_string"&gt;"abcdef"&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToUpper&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;)).&lt;/span&gt;&lt;span class="sh_function"&gt;ForAll&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Write&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;div class="figure"&gt;  &lt;img alt="PLINQ ForAll" height="329" src="http://www.albahari.com/threading/ForAll.png" width="750" /&gt; &lt;/div&gt;&lt;div class="note"&gt;Collating and enumerating results is not a massively expensive operation, so the &lt;code&gt;ForAll&lt;/code&gt; optimization yields the greatest gains when there are large numbers of quickly executing input elements.&lt;/div&gt;&lt;h3&gt;Input-side optimization&lt;/h3&gt;PLINQ has three partitioning strategies for assigning input elements to threads:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;th valign="top"&gt;Strategy&lt;/th&gt;   &lt;th valign="top"&gt;Element allocation&lt;/th&gt;   &lt;th valign="top"&gt;Relative performance&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Chunk partitioning&lt;/td&gt;   &lt;td valign="top"&gt;Dynamic&lt;/td&gt;   &lt;td valign="top"&gt;Average&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Range partitioning&lt;/td&gt;   &lt;td valign="top"&gt;Static&lt;/td&gt;   &lt;td valign="top"&gt;Poor to excellent&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Hash partitioning&lt;/td&gt;   &lt;td valign="top"&gt;Static&lt;/td&gt;   &lt;td valign="top"&gt;Poor&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;For query operators that require comparing elements (&lt;code&gt;GroupBy&lt;/code&gt;, &lt;code&gt;Join&lt;/code&gt;, &lt;code&gt;GroupJoin&lt;/code&gt;, &lt;code&gt;Intersect&lt;/code&gt;, &lt;code&gt;Except&lt;/code&gt;, &lt;code&gt;Union&lt;/code&gt;, and &lt;code&gt;Distinct&lt;/code&gt;), you have no choice: PLINQ always uses &lt;i&gt;hash partitioning&lt;/i&gt;. Hash partitioning is relatively inefficient in that it must precalculate the hashcode of every element (so that elements with identical hashcodes can be processed on the same thread). If you find this too slow, your only option is to call &lt;code&gt;AsSequential&lt;/code&gt; to disable parallelization.&lt;br /&gt;For all other query operators, you have a choice as to whether to use range or chunk partitioning. By default:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If the input sequence is &lt;i&gt;indexable&lt;/i&gt; (if it’s an array or implements &lt;code&gt;IList&lt;t&gt;&lt;/t&gt;&lt;/code&gt;), PLINQ chooses&lt;i&gt; range partitioning&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Otherwise, PLINQ chooses &lt;i&gt;chunk partitioning&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;In a nutshell, range partitioning is faster with long sequences for which every element takes a similar amount of CPU time to process. Otherwise, chunk partitioning is usually faster. &lt;br /&gt;To force &lt;em&gt;range partitioning&lt;/em&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If the query starts with &lt;code&gt;Enumerable.Range&lt;/code&gt;, replace the latter with &lt;code&gt;ParallelEnumerable.Range&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Otherwise, simply call &lt;code&gt;ToList&lt;/code&gt; or &lt;code&gt;ToArray&lt;/code&gt; on the input sequence (obviously, this incurs a performance cost in itself which you should take into account).&lt;/li&gt;&lt;/ul&gt;&lt;div class="warning"&gt;  &lt;code&gt;ParallelEnumerable.Range&lt;/code&gt; is not simply a shortcut for calling &lt;code&gt;Enumerable.Range(&lt;/code&gt;…&lt;code&gt;).AsParallel()&lt;/code&gt;. It changes the performance of the query by activating range partitioning.&lt;/div&gt;To force &lt;em&gt;chunk partitioning&lt;/em&gt;, wrap the input sequence in a call to &lt;code&gt;Partitioner.Create&lt;/code&gt; (in &lt;code&gt;System.Collection.Concurrent&lt;/code&gt;) as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;5&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;6&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;7&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;8&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;9&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;parallelQuery &lt;span class="sh_symbol"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;Partitioner&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Create&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;numbers&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Where&lt;/span&gt; &lt;span class="sh_symbol"&gt;(...)&lt;/span&gt;&lt;/pre&gt;The second argument to &lt;code&gt;Partitioner.Create&lt;/code&gt; indicates that you want to &lt;em&gt;load-balance&lt;/em&gt; the query, which is another way of saying that you want chunk partitioning.&lt;br /&gt;Chunk partitioning works by having each worker thread periodically grab small “chunks” of elements from the input sequence to process. PLINQ starts by allocating very small chunks (one or two elements at a time), then increases the chunk size as the query progresses: this ensures that small sequences are effectively parallelized and large sequences don’t cause excessive round-tripping. If a worker happens to get “easy” elements (that process quickly) it will end up getting more chunks. This system keeps every thread equally busy (and the cores “balanced”); the only downside is that fetching elements from the shared input sequence requires synchronization (typically an &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;exclusive lock&lt;/a&gt;) — and this can result in some overhead and contention.&lt;br /&gt;&lt;div class="figure"&gt;  &lt;img alt="Chunk vs Range Partitioning" height="588" src="http://www.albahari.com/threading/Partitioning.png" width="700" /&gt; &lt;/div&gt;Range partitioning bypasses the normal input-side enumeration and preallocates an equal number of elements to each worker, avoiding contention on the input sequence. But if some threads happen to get easy elements and finish early, they sit idle while the remaining threads continue working. Our earlier prime number calculator might perform poorly with range partitioning. An example of when range partitioning would do well is in calculating the sum of the square roots of the first 10 million integers:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;ParallelEnumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;Sum&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;ParallelEnumerable.Range&lt;/code&gt; returns a &lt;code&gt;ParallelQuery&lt;t&gt;&lt;/t&gt;&lt;/code&gt;, so you don’t need to subsequently call &lt;code&gt;AsParallel&lt;/code&gt;.&lt;br /&gt;&lt;div class="note"&gt;Range partitioning doesn’t necessarily allocate element ranges in &lt;em&gt;contiguous&lt;/em&gt; blocks — it might instead choose a “striping” strategy. For instance, if there are two workers, one worker might process odd-numbered elements while the other processes even-numbered elements. The &lt;code&gt;TakeWhile&lt;/code&gt; operator is almost certain to trigger a striping strategy to avoid unnecessarily processing elements later in the sequence.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Parallelizing_Custom_Aggregations"&gt;Parallelizing Custom Aggregations&lt;/a&gt; &lt;/h2&gt;PLINQ parallelizes the &lt;code&gt;Sum&lt;/code&gt;, &lt;code&gt;Average&lt;/code&gt;, &lt;code&gt;Min&lt;/code&gt;, and &lt;code&gt;Max&lt;/code&gt; operators efficiently without additional intervention. The &lt;code&gt;Aggregate&lt;/code&gt; operator, though, presents special challenges for PLINQ.&lt;br /&gt;If you’re unfamiliar with this operator, you can think of &lt;code&gt;Aggregate&lt;/code&gt; as a generalized version of &lt;code&gt;Sum&lt;/code&gt;, &lt;code&gt;Average&lt;/code&gt;, &lt;code&gt;Min&lt;/code&gt;, and &lt;code&gt;Max&lt;/code&gt; — in other words, an operator that lets you plug in a custom accumulation algorithm for implementing unusual aggregations. The following demonstrates how &lt;code&gt;Aggregate&lt;/code&gt; can do the work of &lt;code&gt;Sum&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; sum &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 9&lt;/span&gt;&lt;/pre&gt;The first argument to &lt;code&gt;Aggregate&lt;/code&gt; is the &lt;i&gt;seed&lt;/i&gt;, from which accumulation starts. The second argument is an expression to update the accumulated value, given a fresh element. You can optionally supply a third argument to project the final result value from the accumulated value. &lt;br /&gt;&lt;div class="note"&gt;Most problems for which &lt;code&gt;Aggregate&lt;/code&gt; has been designed can be solved as easily with a &lt;code&gt;foreach&lt;/code&gt; loop — and with more familiar syntax. The advantage of &lt;code&gt;Aggregate&lt;/code&gt; is precisely that large or complex aggregations can be parallelized declaratively with PLINQ.&lt;/div&gt;&lt;h3&gt;Unseeded aggregations&lt;/h3&gt;You can omit the seed value when calling &lt;code&gt;Aggregate&lt;/code&gt;, in which case the first element becomes the &lt;em&gt;implicit&lt;/em&gt; seed, and aggregation proceeds from the second element. Here’s the preceding example, &lt;em&gt;unseeded&lt;/em&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; sum &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 6&lt;/span&gt;&lt;/pre&gt;This gives the same result as before, but we’re actually doing a &lt;em&gt;different calculation&lt;/em&gt;. Before, we were calculating 0+1+2+3; now we’re calculating 1+2+3. We can better illustrate the difference by multiplying instead of adding:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;prod&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; prod &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 0*1*2*3 = &lt;/span&gt;&lt;b&gt;&lt;span class="sh_comment"&gt;0&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; y &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;prod&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; prod &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;//&amp;nbsp;&amp;nbsp; 1*2*3 = &lt;/span&gt;&lt;b&gt;&lt;span class="sh_comment"&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;As we’ll see shortly, unseeded aggregations have the advantage of being parallelizable without requiring the use of special overloads. However, there is a trap with unseeded aggregations: the unseeded aggregation methods are intended for use with delegates that are &lt;em&gt;commutative&lt;/em&gt; and &lt;em&gt;associative&lt;/em&gt;. If used otherwise, the result is either &lt;em&gt;unintuitive&lt;/em&gt; (with ordinary queries) or &lt;em&gt;nondeterministic&lt;/em&gt; (in the case that you parallelize the query with PLINQ). For example, consider the following function: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;/pre&gt;This is neither commutative nor associative. (For example, 1+2*2 != 2+1*1). Let’s see what happens when we use it to sum the square of the numbers 2, 3, and 4:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; sum &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 27&lt;/span&gt;&lt;/pre&gt;Instead of calculating:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;*&lt;/span&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;*&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;*&lt;/span&gt;&lt;span class="sh_number"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 29&lt;/span&gt;&lt;/pre&gt;it calculates:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;*&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;*&lt;/span&gt;&lt;span class="sh_number"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 27&lt;/span&gt;&lt;/pre&gt;We can fix this in a number of ways. First, we could include 0 as the first element:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;b&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;/b&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;4&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;Not only is this inelegant, but it will still give incorrect results if parallelized — because PLINQ leverages the function’s assumed associativity by selecting &lt;em&gt;multiple&lt;/em&gt; elements as seeds. To illustrate, if we denote our aggregation function as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;/pre&gt;then LINQ to Objects would calculate this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/pre&gt;whereas PLINQ may do this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;span class="sh_function"&gt;f&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_number"&gt;4&lt;/span&gt;&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;/pre&gt;with the following result:&lt;br /&gt;&lt;pre&gt;First partition:&amp;nbsp;&amp;nbsp; a = 0 + 2*2&amp;nbsp; (= 4)&lt;br /&gt;Second partition:&amp;nbsp; b = 3 + 4*4&amp;nbsp; (= 19)&lt;br /&gt;Final result:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a + b*b&amp;nbsp; (= 365)&lt;br /&gt;OR EVEN:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b + a*a&amp;nbsp; (= 35)&amp;nbsp; &lt;/pre&gt;There are two good solutions. The first is to turn this into a seeded aggregation — with zero as the seed. The only complication is that with PLINQ, we’d need to use a special overload in order for the query not to execute sequentially (as we’ll see soon).&lt;br /&gt;The second solution is to restructure the query such that the aggregation function is commutative and associative:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; sum &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;total&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;b&gt;total &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;  Of course, in such simple scenarios you can (and should) use the &lt;code&gt;Sum&lt;/code&gt; operator instead of &lt;code&gt;Aggregate&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; sum &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sum&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;You can actually go quite far just with &lt;code&gt;Sum&lt;/code&gt; and &lt;code&gt;Average&lt;/code&gt;. For instance, you can use &lt;code&gt;Average&lt;/code&gt; to calculate a root-mean-square:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Average&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; n &lt;span class="sh_symbol"&gt;*&lt;/span&gt; n&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;/pre&gt;and even standard deviation:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;double&lt;/span&gt; mean &lt;span class="sh_symbol"&gt;=&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Average&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;double&lt;/span&gt; sdev &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Average&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;n &lt;span class="sh_symbol"&gt;=&amp;gt;&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; &lt;span class="sh_cbracket"&gt;{&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; &lt;span class="sh_type"&gt;double&lt;/span&gt; dif &lt;span class="sh_symbol"&gt;=&lt;/span&gt; n &lt;span class="sh_symbol"&gt;-&lt;/span&gt; mean&lt;span class="sh_symbol"&gt;;&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; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; dif &lt;span class="sh_symbol"&gt;*&lt;/span&gt; dif&lt;span class="sh_symbol"&gt;;&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;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;Both are safe, efficient and fully parallelizable.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Parallelizing Aggregate&lt;/h3&gt;We just saw that for &lt;em&gt;unseeded&lt;/em&gt; aggregations, the supplied delegate must be associative and commutative. PLINQ will give incorrect results if this rule is violated, because it draws &lt;em&gt;multiple seeds&lt;/em&gt; from the input sequence in order to aggregate several partitions of the sequence simultaneously.&lt;br /&gt;Explicitly seeded aggregations might seem like a safe option with PLINQ, but unfortunately these ordinarily execute sequentially because of the reliance on a single seed. To mitigate this, PLINQ provides another overload of &lt;code&gt;Aggregate&lt;/code&gt; that lets you specify multiple seeds — or rather, a &lt;em&gt;seed factory function&lt;/em&gt;. For each thread, it executes this function to generate a separate seed, which becomes a &lt;em&gt;thread-local&lt;/em&gt; accumulator into which it locally aggregates elements.&lt;br /&gt;You must also supply a function to indicate how to combine the local and main accumulators. Finally, this &lt;code&gt;Aggregate&lt;/code&gt; overload (somewhat gratuitously) expects a delegate to perform any final transformation on the result (you can achieve this as easily by running some function on the result yourself afterward). So, here are the four delegates, in the order they are passed:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;   &lt;code&gt;seedFactory&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Returns a new local accumulator&lt;/dd&gt;&lt;dt&gt;   &lt;code&gt;updateAccumulatorFunc&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Aggregates an element into a local accumulator&lt;/dd&gt;&lt;dt&gt;   &lt;code&gt;combineAccumulatorFunc&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Combines a local accumulator with the main accumulator&lt;/dd&gt;&lt;dt&gt;   &lt;code&gt;resultSelector&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Applies any final transformation on the end result&lt;/dd&gt;&lt;/dl&gt;&lt;div class="note"&gt;In simple scenarios, you can specify a &lt;em&gt;seed value&lt;/em&gt; instead of a seed factory. This tactic fails when the seed is a reference type that you wish to mutate, because the same instance will then be shared by each thread.&lt;/div&gt;To give a very simple example, the following sums the values in a &lt;code&gt;numbers&lt;/code&gt; array:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;numbers&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// seedFactory&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;localTotal&lt;span class="sh_symbol"&gt;,&lt;/span&gt; n&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; localTotal &lt;span class="sh_symbol"&gt;+&lt;/span&gt; n&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// updateAccumulatorFunc&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;mainTot&lt;span class="sh_symbol"&gt;,&lt;/span&gt; localTot&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; mainTot &lt;span class="sh_symbol"&gt;+&lt;/span&gt; localTot&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// combineAccumulatorFunc&lt;/span&gt;&lt;br /&gt;&amp;nbsp; finalResult &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; finalResult&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// resultSelector&lt;/span&gt;&lt;/pre&gt;This example is contrived in that we could get the same answer just as efficiently using simpler approaches (such as an unseeded aggregate, or better, the &lt;code&gt;Sum&lt;/code&gt; operator). To give a more realistic example, suppose we wanted to calculate the frequency of each letter in the English alphabet in a given string. A simple sequential solution might look like this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt; text &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_string"&gt;"Let’s suppose this is a really long string"&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;letterFrequencies &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;char&lt;/span&gt; c &lt;span class="sh_keyword"&gt;in&lt;/span&gt; text&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; index &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToUpper&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;-&lt;/span&gt; &lt;span class="sh_string"&gt;'A'&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;index &lt;span class="sh_symbol"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt; &lt;span class="sh_symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt; index &lt;span class="sh_symbol"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; letterFrequencies &lt;span class="sh_symbol"&gt;[&lt;/span&gt;index&lt;span class="sh_symbol"&gt;]++;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;An example of when the input text might be very long is in gene sequencing. The “alphabet” would then consist of the letters &lt;em&gt;a&lt;/em&gt;, &lt;em&gt;c&lt;/em&gt;, &lt;em&gt;g&lt;/em&gt;, and &lt;em&gt;t&lt;/em&gt;.&lt;/div&gt;To parallelize this, we could replace the &lt;code&gt;foreach&lt;/code&gt; statement with a call to &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Parallel.For_and_Parallel.ForEach"&gt;Parallel.ForEach&lt;/a&gt;&lt;/code&gt; (as we’ll cover in the following section), but this will leave us to deal with concurrency issues on the shared array. And &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt; around accessing that array would all but kill the potential for parallelization.&lt;br /&gt;&lt;code&gt;Aggregate&lt;/code&gt; offers a tidy solution. The accumulator, in this case, is an array just like the &lt;code&gt;letterFrequencies&lt;/code&gt; array in our preceding example. Here’s a sequential version using &lt;code&gt;Aggregate&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; result &lt;span class="sh_symbol"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp; text&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Create the "accumulator"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;letterFrequencies&lt;span class="sh_symbol"&gt;,&lt;/span&gt; c&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// Aggregate a letter into the accumulator&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; index &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToUpper&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;-&lt;/span&gt; &lt;span class="sh_string"&gt;'A'&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;index &lt;span class="sh_symbol"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt; &lt;span class="sh_symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt; index &lt;span class="sh_symbol"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; letterFrequencies &lt;span class="sh_symbol"&gt;[&lt;/span&gt;index&lt;span class="sh_symbol"&gt;]++;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; letterFrequencies&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;And now the parallel version, using PLINQ’s special overload:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; result &lt;span class="sh_symbol"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp; text&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Aggregate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;  &lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&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 class="sh_comment"&gt;// Create a new local accumulator&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;localFrequencies&lt;span class="sh_symbol"&gt;,&lt;/span&gt; c&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// Aggregate into the local accumulator&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; index &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_type"&gt;char&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToUpper&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;-&lt;/span&gt; &lt;span class="sh_string"&gt;'A'&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;index &lt;span class="sh_symbol"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt; &lt;span class="sh_symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt; index &lt;span class="sh_symbol"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sh_number"&gt;26&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; localFrequencies &lt;span class="sh_symbol"&gt;[&lt;/span&gt;index&lt;span class="sh_symbol"&gt;]++;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; localFrequencies&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&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;&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 class="sh_comment"&gt;// Aggregate local-&amp;gt;main accumulator&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;mainFreq&lt;span class="sh_symbol"&gt;,&lt;/span&gt; localFreq&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mainFreq&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Zip&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;localFreq&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;f1&lt;span class="sh_symbol"&gt;,&lt;/span&gt; f2&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; f1 &lt;span class="sh_symbol"&gt;+&lt;/span&gt; f2&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;(),&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finalResult &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; finalResult&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Perform any final transformation&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// on the end result.&lt;/span&gt;&lt;/pre&gt;Notice that the local accumulation function &lt;em&gt;mutates&lt;/em&gt; the &lt;code&gt;localFrequencies&lt;/code&gt; array. This ability to perform this optimization is important — and is legitimate because &lt;code&gt;localFrequencies&lt;/code&gt; is local to each thread.&lt;br /&gt;&lt;h1&gt;  &lt;a href="" name="_The_Parallel_Class"&gt;The Parallel Class&lt;/a&gt; &lt;/h1&gt;PFX provides a basic form of structured parallelism via three static methods in the &lt;code&gt;Parallel&lt;/code&gt; class:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;   &lt;code&gt;Parallel.Invoke&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Executes an array of delegates in parallel&lt;/dd&gt;&lt;dt&gt;   &lt;code&gt;Parallel.For&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Performs the parallel equivalent of a C# &lt;code&gt;for&lt;/code&gt; loop&lt;/dd&gt;&lt;dt&gt;   &lt;code&gt;Parallel.ForEach&lt;/code&gt;  &lt;/dt&gt;&lt;dd&gt;Performs the parallel equivalent of a C# &lt;code&gt;foreach&lt;/code&gt; loop&lt;/dd&gt;&lt;/dl&gt;All three methods block until all work is complete. As with &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt;, after an unhandled exception, remaining workers are stopped after their current iteration and the exception (or exceptions) are thrown back to the caller — wrapped in an &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;AggregateException&lt;/a&gt;&lt;/code&gt;. &lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Parallel.Invoke"&gt;Parallel.Invoke&lt;/a&gt; &lt;/h2&gt;&lt;code&gt;Parallel.Invoke&lt;/code&gt; executes an array of &lt;code&gt;Action&lt;/code&gt; delegates in parallel, and then waits for them to complete. The simplest version of the method is defined as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;b&gt;&lt;span class="sh_function"&gt;Invoke&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;params&lt;/span&gt; Action&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; actions&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Here’s how we can use &lt;code&gt;Parallel.Invoke&lt;/code&gt; to download two web pages at once:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Invoke&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadFile&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"http://www.linqpad.net"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"lp.html"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadFile&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"http://www.jaoo.dk"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"jaoo.html"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;On the surface, this seems like a convenient shortcut for creating and waiting on two &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;Task&lt;/a&gt;&lt;/code&gt; objects (or &lt;a href="http://www.albahari.com/threading/#_Asynchronous_delegates"&gt;asynchronous delegates&lt;/a&gt;). But there’s an important difference: &lt;code&gt;Parallel.Invoke&lt;/code&gt; still works efficiently if you pass in an array of a million delegates. This is because it &lt;em&gt;partitions&lt;/em&gt; large numbers of elements into batches which it assigns to a handful of underlying &lt;code&gt;Task&lt;/code&gt;s — rather than creating a separate &lt;code&gt;Task&lt;/code&gt; for each delegate.&lt;br /&gt;As with all of &lt;code&gt;Parallel&lt;/code&gt;’s methods, you’re on your own when it comes to collating the results. This means you need to keep &lt;a href="http://www.albahari.com/threading/part2.aspx#_Thread_Safety"&gt;thread safety&lt;/a&gt; in mind. The following, for instance, is thread-unsafe:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;data &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; List&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Invoke&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;b&gt;data&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadString&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"http://www.foo.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)),&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;b&gt;data&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadString&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"http://www.far.com"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)));&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;Locking&lt;/a&gt; around adding to the list would resolve this, although locking would create a bottleneck if you had a much larger array of quickly executing delegates. A better solution is to use a thread-safe collection such as &lt;a href="http://www.albahari.com/threading/part5.aspx#_ConcurrentBagT"&gt;ConcurrentBag&lt;/a&gt; would be ideal in this case.&lt;br /&gt;&lt;code&gt;Parallel.Invoke&lt;/code&gt; is also overloaded to accept a &lt;code&gt;ParallelOptions&lt;/code&gt; object:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;b&gt;&lt;span class="sh_function"&gt;Invoke&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;ParallelOptions&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;options&lt;span class="sh_symbol"&gt;,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_keyword"&gt;params&lt;/span&gt; Action&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; actions&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;With &lt;code&gt;ParallelOptions&lt;/code&gt;, you can insert a &lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;cancellation token&lt;/a&gt;, limit the maximum concurrency, and specify a &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Schedulers_and_UIs"&gt;custom task scheduler&lt;/a&gt;. A cancellation token is relevant when you’re executing (roughly) more tasks than you have cores: upon cancellation, any unstarted delegates will be abandoned. Any already-executing delegates will, however, continue to completion. See &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ_Cancellation"&gt;Cancellation&lt;/a&gt; for an example of how to use cancellation tokens.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Parallel.For_and_Parallel.ForEach"&gt;Parallel.For and Parallel.ForEach&lt;/a&gt; &lt;/h2&gt;&lt;code&gt;Parallel.For&lt;/code&gt; and &lt;code&gt;Parallel.ForEach&lt;/code&gt; perform the equivalent of a C# &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;foreach&lt;/code&gt; loop, but with each iteration executing in parallel instead of sequentially. Here are their (simplest) signatures:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_usertype"&gt;ParallelLoopResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; fromInclusive&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; toExclusive&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_usertype"&gt;Action&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;body&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_usertype"&gt;ParallelLoopResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;b&gt;ForEach&lt;/b&gt;&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;TSource&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;IEnumerable&lt;tsource&gt; source, Action&lt;tsource&gt;&lt;/tsource&gt;&lt;/tsource&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;body&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/pre&gt;The following sequential &lt;code&gt;for&lt;/code&gt; loop:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_function"&gt;Foo&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;is parallelized like this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_function"&gt;Foo&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;or more simply:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; Foo&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;And the following sequential &lt;code&gt;foreach&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;char&lt;/span&gt; &lt;span class="sh_usertype"&gt;c&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_keyword"&gt;in&lt;/span&gt; &lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_function"&gt;Foo&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;is parallelized like this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ForEach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; Foo&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;To give a practical example, if we import the &lt;code&gt;System.Security.Cryptography&lt;/code&gt; namespace, we can generate six public/private key-pair strings in parallel as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;keyPairs &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;6&lt;/span&gt;&lt;span class="sh_symbol"&gt;];&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; keyPairs&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Length&lt;span class="sh_symbol"&gt;,&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;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; keyPairs&lt;span class="sh_symbol"&gt;[&lt;/span&gt;i&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; RSA&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Create&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;ToXmlString&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;As with &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Parallel.Invoke"&gt;Parallel.Invoke&lt;/a&gt;&lt;/code&gt;, we can feed &lt;code&gt;Parallel.For&lt;/code&gt; and &lt;code&gt;Parallel.ForEach&lt;/code&gt; a large number of work items and they’ll be efficiently partitioned onto a few tasks.&lt;br /&gt;&lt;div class="note"&gt;  The latter query could also be done with &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; keyPairs &lt;span class="sh_symbol"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp; ParallelEnumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;6&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; RSA&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Create&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;ToXmlString&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Outer versus inner loops&lt;/h3&gt;&lt;code&gt;Parallel.For&lt;/code&gt; and &lt;code&gt;Parallel.ForEach&lt;/code&gt; usually work best on outer rather than inner loops. This is because with the former, you’re offering larger chunks of work to parallelize, diluting the management overhead. Parallelizing both inner and outer loops is usually unnecessary. In the following example, we’d typically need more than 100 cores to benefit from the inner parallelization: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;50&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; j &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_function"&gt;Foo&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;,&lt;/span&gt; j&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Sequential would be better&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&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; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// for the inner loop.&lt;/span&gt;&lt;/pre&gt;&lt;h3&gt;Indexed Parallel.ForEach&lt;/h3&gt;Sometimes it’s useful to know the loop iteration index. With a sequential &lt;code&gt;foreach&lt;/code&gt;, it’s easy:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;char&lt;/span&gt; &lt;span class="sh_usertype"&gt;c&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_keyword"&gt;in&lt;/span&gt; &lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToString&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;b&gt;i&lt;span class="sh_symbol"&gt;++&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Incrementing a shared variable, however, is not thread-safe in a parallel context. You must instead use the following version of &lt;code&gt;ForEach&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_usertype"&gt;ParallelLoopResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ForEach&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;TSource&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;IEnumerable&lt;tsource&gt; source, Action&lt;tsource,parallelloopstate&gt;&lt;/tsource,parallelloopstate&gt;&lt;/tsource&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="sh_usertype"&gt;,long&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_usertype"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;body&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/pre&gt;We’ll ignore &lt;code&gt;ParallelLoopState&lt;/code&gt; (which we’ll cover in the following section). For now, we’re interested in &lt;code&gt;Action&lt;/code&gt;’s third type parameter of type &lt;code&gt;long&lt;/code&gt;, which indicates the loop index:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ForEach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;,&lt;/span&gt; state&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToString&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;+&lt;/span&gt; i&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;To put this into a practical context, we’ll revisit the &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ_Spellchecker"&gt;spellchecker that we wrote with PLINQ&lt;/a&gt;. The following code loads up a dictionary along with an array of a million words to test:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;File&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Exists&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Contains about 150,000 words&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadFile&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_string"&gt;"http://www.albahari.com/ispell/allwords.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;wordLookup &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; HashSet&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; File&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ReadAllLines&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"WordLookup.txt"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&lt;br /&gt;&amp;nbsp; StringComparer&lt;span class="sh_symbol"&gt;.&lt;/span&gt;InvariantCultureIgnoreCase&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;random &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Random&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;=&lt;/span&gt; wordLookup&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; wordsToTest &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Select&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; wordList &lt;span class="sh_symbol"&gt;[&lt;/span&gt;random&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Next&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; wordList&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Length&lt;span class="sh_symbol"&gt;)])&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;wordsToTest &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;12345&lt;/span&gt;&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_string"&gt;"woozsh"&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Introduce a couple&lt;/span&gt;&lt;br /&gt;wordsToTest &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;23456&lt;/span&gt;&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_string"&gt;"wubsie"&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// of spelling mistakes.&lt;/span&gt;&lt;/pre&gt;We can perform the spellcheck on our &lt;code&gt;wordsToTest&lt;/code&gt; array using the indexed version of &lt;code&gt;Parallel.ForEach&lt;/code&gt; as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;misspellings &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; ConcurrentBag&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Tuple&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ForEach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;wordsToTest&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;word&lt;span class="sh_symbol"&gt;,&lt;/span&gt; state&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;wordLookup&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Contains&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;word&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; misspellings&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Tuple&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Create&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; i&lt;span class="sh_symbol"&gt;,&lt;/span&gt; word&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Notice that we had to collate the results into a thread-safe collection: having to do this is the disadvantage when compared to using PLINQ. The advantage over PLINQ is that we avoid the cost of applying an indexed &lt;code&gt;Select&lt;/code&gt; query operator — which is less efficient than an indexed &lt;code&gt;ForEach&lt;/code&gt;.&lt;br /&gt;&lt;h3&gt;ParallelLoopState: Breaking early out of loops &lt;/h3&gt;Because the loop body in a parallel &lt;code&gt;For&lt;/code&gt; or &lt;code&gt;ForEach&lt;/code&gt; is a delegate, you can’t exit the loop early with a &lt;code&gt;break&lt;/code&gt; statement. Instead, you must call &lt;code&gt;Break&lt;/code&gt; or &lt;code&gt;Stop&lt;/code&gt; on a &lt;code&gt;ParallelLoopState&lt;/code&gt; object:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;ParallelLoopState&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Break&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Stop&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; IsExceptional &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;get&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; IsStopped &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;get&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;long&lt;/span&gt;&lt;span class="sh_symbol"&gt;?&lt;/span&gt; LowestBreakIteration &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;get&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; ShouldExitCurrentIteration &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;get&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Obtaining a &lt;code&gt;ParallelLoopState&lt;/code&gt; is easy: all versions of &lt;code&gt;For&lt;/code&gt; and &lt;code&gt;ForEach&lt;/code&gt; are overloaded to accept loop bodies of type &lt;code&gt;Action&lt;tsource,parallelloopstate&gt;&lt;/tsource,parallelloopstate&gt;&lt;/code&gt;. So, to parallelize this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;char&lt;/span&gt; &lt;span class="sh_usertype"&gt;c&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_keyword"&gt;in&lt;/span&gt; &lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;==&lt;/span&gt; &lt;span class="sh_string"&gt;','&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span class="sh_keyword"&gt;break&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;do this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ForEach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello, world"&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;,&lt;/span&gt; loopState&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c &lt;span class="sh_symbol"&gt;==&lt;/span&gt; &lt;span class="sh_string"&gt;','&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;loopState&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Break&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;c&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="output"&gt;Hlloe&lt;/pre&gt;You can see from the output that loop bodies may complete in a random order. Aside from this difference, calling &lt;code&gt;Break&lt;/code&gt; yields &lt;em&gt;at least&lt;/em&gt; the same elements as executing the loop sequentially: this example will always output &lt;em&gt;at least&lt;/em&gt; the letters &lt;em&gt;H&lt;/em&gt;, &lt;em&gt;e&lt;/em&gt;, &lt;em&gt;l&lt;/em&gt;, &lt;em&gt;l&lt;/em&gt;, and &lt;em&gt;o&lt;/em&gt; in some order. In contrast, calling &lt;code&gt;Stop&lt;/code&gt; instead of &lt;code&gt;Break&lt;/code&gt; forces all threads to finish right after their current iteration. In our example, calling &lt;code&gt;Stop&lt;/code&gt; could give us a subset of the letters &lt;em&gt;H&lt;/em&gt;, &lt;em&gt;e&lt;/em&gt;, &lt;em&gt;l&lt;/em&gt;, &lt;em&gt;l&lt;/em&gt;, and &lt;em&gt;o&lt;/em&gt; if another thread was lagging behind. Calling &lt;code&gt;Stop&lt;/code&gt; is useful when you’ve found something that you’re looking for — or when something has gone wrong and you won’t be looking at the results.&lt;br /&gt;&lt;div class="note"&gt;  The &lt;code&gt;Parallel.For&lt;/code&gt; and &lt;code&gt;Parallel.ForEach&lt;/code&gt; methods return a &lt;code&gt;ParallelLoopResult&lt;/code&gt; object that exposes properties called &lt;code&gt;IsCompleted&lt;/code&gt; and &lt;code&gt;LowestBreakIteration&lt;/code&gt;. These tell you whether the loop ran to completion, and if not, at what cycle the loop was broken.&lt;br /&gt;If &lt;code&gt;LowestBreakIteration&lt;/code&gt; returns null, it means that you called &lt;code&gt;Stop&lt;/code&gt; (rather than &lt;code&gt;Break&lt;/code&gt;) on the loop.&lt;br /&gt;&lt;/div&gt;If your loop body is long, you might want other threads to break partway through the method body in case of an early &lt;code&gt;Break&lt;/code&gt; or &lt;code&gt;Stop&lt;/code&gt;. You can do this by polling the &lt;code&gt;ShouldExitCurrentIteration&lt;/code&gt; property at various places in your code; this property becomes true immediately after a &lt;code&gt;Stop&lt;/code&gt; — or soon after a &lt;code&gt;Break&lt;/code&gt;.&lt;br /&gt;&lt;div class="note"&gt;  &lt;code&gt;ShouldExitCurrentIteration&lt;/code&gt; also becomes true after a cancellation request — or if an exception is thrown in the loop.&lt;/div&gt;&lt;code&gt;IsExceptional&lt;/code&gt; lets you know whether an exception has occurred on another thread. Any unhandled exception will cause the loop to stop after each thread’s current iteration: to avoid this, you must explicitly handle exceptions in your code.&lt;br /&gt;&lt;h3&gt;Optimization with local values&lt;/h3&gt;&lt;code&gt;Parallel.For&lt;/code&gt; and &lt;code&gt;Parallel.ForEach&lt;/code&gt; each offer a set of overloads that feature a generic type argument called &lt;code&gt;TLocal&lt;/code&gt;. These overloads are designed to help you optimize the collation of data with iteration-intensive loops. The simplest is this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_usertype"&gt;ParallelLoopResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;For &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;b&gt;TLocal&lt;/b&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; fromInclusive&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="sh_type"&gt;int&lt;/span&gt; toExclusive&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;Func &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;TLocal&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; localInit&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;Func &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; ParallelLoopState&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;b&gt;TLocal&lt;span class="sh_symbol"&gt;,&lt;/span&gt; TLocal&lt;/b&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; body&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;Action &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;TLocal&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; localFinally&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;These methods are rarely needed in practice because their target scenarios are covered mostly by &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt; (which is fortunate because these overloads are somewhat intimidating!).&lt;br /&gt;Essentially, the problem is this: suppose we want to sum the square roots of the numbers 1 through 10,000,000. Calculating 10 million square roots is easily parallelizable, but summing their values is troublesome because we must &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt; around updating the total:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;object&lt;/span&gt; locker &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;object&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;double&lt;/span&gt; total &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&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;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt; total &lt;span class="sh_symbol"&gt;+=&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;The gain from parallelization is more than offset by the cost of obtaining 10 million locks — plus the resultant blocking.&lt;br /&gt;The reality, though, is that we don’t actually &lt;em&gt;need&lt;/em&gt; 10 million locks. Imagine a team of volunteers picking up a large volume of litter. If all workers shared a single trash can, the travel and contention would make the process extremely inefficient. The obvious solution is for each worker to have a private or “local” trash can, which is occasionally emptied into the main bin.&lt;br /&gt;The &lt;code&gt;TLocal&lt;/code&gt; versions of &lt;code&gt;For&lt;/code&gt; and &lt;code&gt;ForEach&lt;/code&gt; work in exactly this way. The volunteers are internal worker threads, and the &lt;em&gt;local value&lt;/em&gt; represents a local trash can. In order for &lt;code&gt;Parallel&lt;/code&gt; to do this job, you must feed it two additional delegates that indicate:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How to initialize a new local value&lt;/li&gt;&lt;li&gt;How to combine a local aggregation with the master value&lt;/li&gt;&lt;/ol&gt;Additionally, instead of the body delegate returning &lt;code&gt;void&lt;/code&gt;, it should return the new aggregate for the local value. Here’s our example refactored:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;object&lt;/span&gt; locker &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;object&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;double&lt;/span&gt; grandTotal &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;For&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0.0&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Initialize the local value.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;,&lt;/span&gt; state&lt;span class="sh_symbol"&gt;,&lt;/span&gt; localTotal&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Body delegate. Notice that it&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;localTotal &lt;span class="sh_symbol"&gt;+&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;),&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// returns the new local total.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; localTotal &lt;span class="sh_symbol"&gt;=&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// Add the local value&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt; grandTotal &lt;span class="sh_symbol"&gt;+=&lt;/span&gt; localTotal&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// to the master value.&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;We must still lock, but only around aggregating the local value to the grand total. This makes the process dramatically more efficient.&lt;br /&gt;&lt;div class="note"&gt;  As stated earlier, PLINQ is often a good fit in these scenarios. Our example could be parallelized with PLINQ simply like this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;ParallelEnumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&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;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sum&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;i&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;/pre&gt;(Notice that we used &lt;code&gt;ParallelEnumerable&lt;/code&gt; to force &lt;em&gt;range partitioning&lt;/em&gt;: this improves performance in this case because all numbers will take equally long to process.)&lt;br /&gt;In more complex scenarios, you might use LINQ’s &lt;code&gt;Aggregate&lt;/code&gt; operator instead of &lt;code&gt;Sum&lt;/code&gt;. If you supplied a local seed factory, the situation would be somewhat analogous to providing a local value function with &lt;code&gt;Parallel.For&lt;/code&gt;.&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;  &lt;a href="" name="_Task_Parallelism"&gt;Task Parallelism&lt;/a&gt; &lt;/h1&gt;&lt;i&gt;Task parallelism&lt;/i&gt; is the lowest-level approach to parallelization with PFX. The classes for working at this level are defined in the &lt;code&gt;System.Threading.Tasks&lt;/code&gt; namespace and comprise the following:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;th valign="top"&gt;Class&lt;/th&gt;   &lt;th valign="top"&gt;Purpose&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;     &lt;a href="http://www.albahari.com/threading/part5.aspx#_Creating_and_Starting_Tasks"&gt;Task&lt;/a&gt;    &lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For managing a unit for work&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;     &lt;a href="http://www.albahari.com/threading/part5.aspx#_Creating_and_Starting_Tasks"&gt;Task&lt;tresult&gt;&lt;/tresult&gt;&lt;/a&gt;    &lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For managing a unit for work with a return value&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;     &lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskFactory"&gt;TaskFactory&lt;/a&gt;    &lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For creating tasks&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;     &lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskFactory"&gt;TaskFactory&lt;tresult&gt;&lt;/tresult&gt;&lt;/a&gt;    &lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For creating tasks and continuations with the same return   type&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;     &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Schedulers_and_UIs"&gt;TaskScheduler&lt;/a&gt;    &lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For managing the scheduling of tasks&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskCompletionSource"&gt;TaskCompletionSource&lt;/a&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;For manually controlling a task’s workflow&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Essentially, a task is a lightweight object for managing a parallelizable unit of work. A task avoids the overhead of starting a dedicated thread by using the CLR’s &lt;a href="http://www.albahari.com/threading/#_Thread_Pooling"&gt;thread pool&lt;/a&gt;: this is the same thread pool used by &lt;code&gt;ThreadPool.QueueUserWorkItem&lt;/code&gt;, tweaked in CLR 4.0 to work more efficiently with &lt;code&gt;Task&lt;/code&gt;s (and more efficiently in general).&lt;br /&gt;Tasks can be used whenever you want to execute something in parallel. However, they’re &lt;em&gt;tuned&lt;/em&gt; for leveraging multicores: in fact, the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class and &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt; are internally built on the task parallelism constructs.&lt;br /&gt;Tasks do more than just provide an easy and efficient way into the thread pool. They also provide some powerful features for managing units of work, including the ability to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   &lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskCreationOptions"&gt;Tune a task’s scheduling&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;Establish a &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;parent/child relationship&lt;/a&gt; when one task is started from another &lt;/li&gt;&lt;li&gt;Implement &lt;a href="http://www.albahari.com/threading/part5.aspx#_Canceling_Tasks"&gt;cooperative cancellation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;   &lt;a href="http://www.albahari.com/threading/part5.aspx#_Waiting_on_Tasks"&gt;Wait on a set of tasks&lt;/a&gt; — without a signaling construct&lt;/li&gt;&lt;li&gt;Attach “&lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuation&lt;/a&gt;” task(s) &lt;/li&gt;&lt;li&gt;Schedule a continuation based on &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations_with_multiple_antecedents"&gt;multiple antecedent tasks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Propagate exceptions &lt;a href="http://www.albahari.com/threading/part5.aspx#_Exception-Handling_Tasks"&gt;to parents&lt;/a&gt;, &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations_and_exceptions"&gt;continuations&lt;/a&gt;, and &lt;a href="http://www.albahari.com/threading/part5.aspx#_Exception-Handling_Tasks"&gt;task consumers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Tasks also implement &lt;em&gt;local work queues&lt;/em&gt;, an optimization that allows you to efficiently create many quickly executing child tasks without incurring the contention overhead that would otherwise arise with a single work queue.&lt;br /&gt;&lt;div class="warning"&gt;The Task Parallel Library lets you create hundreds (or even thousands) of tasks with minimal overhead. But if you want to create millions of tasks, you’ll need to partition those tasks into larger work units to maintain efficiency. The &lt;code&gt;Parallel&lt;/code&gt; class and PLINQ do this automatically.&lt;/div&gt;&lt;div class="note"&gt;Visual Studio 2010 provides a new window for monitoring tasks (Debug | Window | Parallel Tasks). This is equivalent to the Threads window, but for tasks. The Parallel Stacks window also has a special mode for tasks.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Creating_and_Starting_Tasks"&gt;Creating and Starting Tasks&lt;/a&gt; &lt;/h2&gt;As we described in Part 1 in our &lt;a href="http://www.albahari.com/threading/#_Thread_Pooling"&gt;discussion of thread pooling&lt;/a&gt;, you can create and start a &lt;code&gt;Task&lt;/code&gt; by calling &lt;code&gt;Task.Factory.StartNew&lt;/code&gt;, passing in an &lt;code&gt;Action&lt;/code&gt; delegate:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello from a task!"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;The generic version, &lt;code&gt;Task&lt;tresult&gt;&lt;/tresult&gt;&lt;/code&gt; (a subclass of &lt;code&gt;Task&lt;/code&gt;), lets you get data back from a task upon completion:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;StartNew&lt;b&gt;&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Begin task&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_preproc"&gt;using&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;wc &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; System&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Net&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WebClient&lt;/span&gt;&lt;span class="sh_symbol"&gt;())&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; wc&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;DownloadString&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"http://www.linqpad.net"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_function"&gt;RunSomeOtherMethod&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// We can do other work in parallel...&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt; result &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;b&gt;task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Wait for task to finish and fetch result.&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;Task.Factory.StartNew&lt;/code&gt; creates and starts a task in one step. You can decouple these operations by first instantiating a &lt;code&gt;Task&lt;/code&gt; object, and then calling &lt;code&gt;Start&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Task&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Start&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;A task that you create in this manner can also be run synchronously (on the same thread) by calling &lt;code&gt;RunSynchronously&lt;/code&gt; instead of &lt;code&gt;Start&lt;/code&gt;.&lt;br /&gt;&lt;div class="note"&gt;You can track a task’s execution status via its &lt;code&gt;Status&lt;/code&gt; property. &lt;/div&gt;&lt;h3&gt;Specifying a state object&lt;/h3&gt;When instantiating a task or calling &lt;code&gt;Task.Factory.StartNew&lt;/code&gt;, you can specify a &lt;em&gt;state&lt;/em&gt; object, which is passed to the target method. This is useful should you want to call a method directly rather than using a lambda expression:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Main&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Greet&lt;b&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"Hello"&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Wait for task to complete.&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Greet&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;object&lt;/span&gt; state&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;state&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Hello&lt;/span&gt;&lt;/pre&gt;Given that we have lambda expressions in C#, we can put the &lt;em&gt;state&lt;/em&gt; object to better use, which is to assign a meaningful name to the task. We can then use the &lt;code&gt;AsyncState&lt;/code&gt; property to query its name:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Main&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;state &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_function"&gt;Greet&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Hello"&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;b&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"Greeting"&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;AsyncState&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// &lt;/span&gt;&lt;b&gt;&lt;span class="sh_comment"&gt;Greeting&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Greet&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt; message&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;message&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;Visual Studio displays each task’s &lt;code&gt;AsyncState&lt;/code&gt; in the Parallel Tasks window, so having a meaningful name here can ease debugging considerably.&lt;/div&gt;&lt;h3&gt;  &lt;a href="" name="_TaskCreationOptions"&gt;TaskCreationOptions&lt;/a&gt; &lt;/h3&gt;You can tune a task’s execution by specifying a &lt;code&gt;TaskCreationOptions&lt;/code&gt; enum when calling &lt;code&gt;StartNew&lt;/code&gt; (or instantiating a &lt;code&gt;Task&lt;/code&gt;). &lt;code&gt;TaskCreationOptions&lt;/code&gt; is a flags enum with the following (combinable) values:&lt;br /&gt;&lt;pre&gt;LongRunning&lt;br /&gt;PreferFairness&lt;br /&gt;AttachedToParent&lt;/pre&gt;&lt;code&gt;LongRunning&lt;/code&gt; suggests to the scheduler to dedicate a thread to the task. This is beneficial for long-running tasks because they might otherwise “hog” the queue, and force short-running tasks to wait an unreasonable amount of time before being scheduled. &lt;code&gt;LongRunning&lt;/code&gt; is also good for &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;blocking&lt;/a&gt; tasks.&lt;br /&gt;&lt;div class="note"&gt;The task queuing problem arises because the task scheduler ordinarily tries to keep just enough tasks active on threads at once to keep each CPU core busy. Not &lt;em&gt;oversubscribing&lt;/em&gt; the CPU with too many active threads avoids the degradation in performance that would occur if the operating system was forced to perform a lot of expensive time slicing and context switching. &lt;/div&gt;&lt;code&gt;PreferFairness&lt;/code&gt; tells the scheduler to try to ensure that tasks are scheduled in the order they were started. It may ordinarily do otherwise, because it internally optimizes the scheduling of tasks using local work-stealing queues. This optimization is of practical benefit with very small (fine-grained) tasks.&lt;br /&gt;&lt;code&gt;AttachedToParent&lt;/code&gt; is for creating &lt;i&gt;child tasks&lt;/i&gt;.&lt;br /&gt;&lt;h3&gt;  &lt;a href="" name="_Child_tasks"&gt;Child tasks&lt;/a&gt; &lt;/h3&gt;When one task starts another, you can optionally establish a parent-child relationship by specifying &lt;code&gt;TaskCreationOptions.AttachedToParent&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;parent &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"I am a parent"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// Detached task&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"I am detached"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_comment"&gt;// Child task&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"I am a child"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;AttachedToParent&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;A child task is special in that when you wait for the &lt;i&gt;parent&lt;/i&gt; task to complete, it waits for any children as well. This can be particularly useful when a child task is a &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuation&lt;/a&gt;, as we’ll see shortly.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Waiting_on_Tasks"&gt;Waiting on Tasks&lt;/a&gt; &lt;/h2&gt;You can explicitly wait for a task to complete in two ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Calling its &lt;code&gt;Wait&lt;/code&gt; method (optionally with a timeout)&lt;/li&gt;&lt;li&gt;Accessing its &lt;code&gt;Result&lt;/code&gt; property (in the case of &lt;code&gt;Task&lt;tresult&gt;&lt;/tresult&gt;&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;You can also wait on multiple tasks at once — via the static methods &lt;code&gt;Task.WaitAll&lt;/code&gt; (waits for all the specified tasks to finish) and &lt;code&gt;Task.WaitAny&lt;/code&gt; (waits for just one task to finish).&lt;br /&gt;&lt;code&gt;WaitAll&lt;/code&gt; is similar to waiting out each task in turn, but is more efficient in that it requires (at most) just one context switch. Also, if one or more of the tasks throw an unhandled exception, &lt;code&gt;WaitAll&lt;/code&gt; still waits out every task — and then rethrows a single &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;AggregateException&lt;/a&gt;&lt;/code&gt; that accumulates the exceptions from each faulted task. It’s equivalent to doing this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_comment"&gt;// Assume t1, t2 and t3 are tasks:&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;exceptions &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; List&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; t1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt; &lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ex&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; exceptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; t2&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt; &lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ex&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; exceptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; t3&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt; &lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ex&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; exceptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;exceptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Count &lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;AggregateException&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;exceptions&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Calling &lt;code&gt;WaitAny&lt;/code&gt; is equivalent to waiting on a &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_ManualResetEvent"&gt;ManualResetEventSlim&lt;/a&gt;&lt;/code&gt; that’s signaled by each task as it finishes. &lt;br /&gt;As well as a timeout, you can also pass in a &lt;i&gt;&lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;cancellation token&lt;/a&gt;&lt;/i&gt; to the &lt;code&gt;Wait&lt;/code&gt; methods: this lets you cancel the wait — &lt;em&gt;not the task itself&lt;/em&gt;.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Exception-Handling_Tasks"&gt;Exception-Handling Tasks&lt;/a&gt; &lt;/h2&gt;When you wait for a task to complete (by calling its &lt;code&gt;Wait&lt;/code&gt; method or accessing its &lt;code&gt;Result&lt;/code&gt; property), any unhandled exceptions are conveniently rethrown to the caller, wrapped in an &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;AggregateException&lt;/a&gt;&lt;/code&gt; object. This usually avoids the need to write code &lt;em&gt;within&lt;/em&gt; task blocks to handle unexpected exceptions; instead we can do this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;calc &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;7&lt;/span&gt; &lt;span class="sh_symbol"&gt;/&lt;/span&gt; x&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;calc&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;aex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;aex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;InnerException&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Message&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Attempted to divide by 0&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;You still need to exception-handle detached autonomous tasks (unparented tasks that are not waited upon) in order to prevent an unhandled exception taking down the application when the task drops out of scope and is garbage-collected (subject to the following note). The same applies for tasks waited upon with a timeout, because any exception thrown &lt;em&gt;after&lt;/em&gt; the timeout interval will otherwise be “unhandled.”&lt;br /&gt;&lt;div class="note"&gt;The static &lt;code&gt;TaskScheduler.UnobservedTaskException&lt;/code&gt; event provides a final last resort for dealing with unhandled task exceptions. By handling this event, you can intercept task exceptions that would otherwise end the application — and provide your own logic for dealing with them. &lt;/div&gt;For parented tasks, waiting on the parent implicitly waits on the &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;children&lt;/a&gt; — and any child exceptions then bubble up:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;TaskCreationOptions&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;atp &lt;span class="sh_symbol"&gt;=&lt;/span&gt; TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;AttachedToParent&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;parent &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Child&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; atp&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Grandchild&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; atp&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_comment"&gt;// The following call throws a NullReferenceException (wrapped&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_comment"&gt;// in nested AggregateExceptions):&lt;/span&gt;&lt;br /&gt;parent&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;Interestingly, if you check a task’s &lt;code&gt;Exception&lt;/code&gt; property after it has thrown an exception, the act of reading that property will prevent the exception from subsequently taking down your application. The rationale is that PFX’s designers don’t want you &lt;em&gt;ignoring&lt;/em&gt; exceptions — as long as you acknowledge them in some way, they won’t punish you by terminating your program.&lt;/div&gt;&lt;div class="warning"&gt;An unhandled exception on a task doesn’t cause &lt;em&gt;immediate&lt;/em&gt; application termination: instead, it’s delayed until the garbage collector catches up with the task and calls its finalizer. Termination is delayed because it can’t be known for certain that you don’t plan to call &lt;code&gt;Wait&lt;/code&gt; or check its &lt;code&gt;Result&lt;/code&gt; or &lt;code&gt;Exception&lt;/code&gt; property until the task is garbage-collected. This delay can sometimes mislead you as to the original source of the error (although Visual Studio’s debugger can assist if you enable breaking on first-chance exceptions).&lt;/div&gt;As we’ll see soon, an alternative strategy for dealing with exceptions is with &lt;i&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuations&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Canceling_Tasks"&gt;Canceling Tasks&lt;/a&gt; &lt;/h2&gt;You can optionally pass in a &lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;cancellation token&lt;/a&gt; when starting a task. This lets you cancel tasks via the cooperative cancellation pattern &lt;a href="http://www.albahari.com/threading/part3.aspx#_Cancellation_Tokens"&gt;described previously&lt;/a&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;cancelSource &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;CancellationToken&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;token &lt;span class="sh_symbol"&gt;=&lt;/span&gt; cancelSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Token&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Do some stuff...&lt;/span&gt;&lt;br /&gt;&amp;nbsp; token&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ThrowIfCancellationRequested&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Check for cancellation request&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Do some stuff...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;b&gt;token&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;cancelSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Cancel&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;To detect a canceled task, catch an &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Working_with_AggregateException"&gt;AggregateException&lt;/a&gt;&lt;/code&gt; and check the inner exception as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;InnerException &lt;span class="sh_keyword"&gt;is&lt;/span&gt; OperationCanceledException&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Task canceled!"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;If you want to explicitly throw an &lt;code&gt;OperationCanceledException&lt;/code&gt; (rather than calling &lt;code&gt;token.ThrowIfCancellationRequested&lt;/code&gt;), you must pass the cancellation token into &lt;code&gt;OperationCanceledException&lt;/code&gt;’s constructor. If you fail to do this, the task won’t end up with a &lt;code&gt;TaskStatus.Canceled&lt;/code&gt; status and won’t trigger &lt;code&gt;OnlyOnCanceled&lt;/code&gt; continuations.&lt;/div&gt;If the task is canceled before it has started, it won’t get scheduled — an &lt;code&gt;OperationCanceledException&lt;/code&gt; will instead be thrown on the task immediately.&lt;br /&gt;Because cancellation tokens are recognized by other APIs, you can pass them into other constructs and cancellations will propagate seamlessly:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;cancelSource &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;CancellationToken&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;token &lt;span class="sh_symbol"&gt;=&lt;/span&gt; cancelSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Token&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Pass our cancellation token into a PLINQ query:&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;i&gt;someSequence&lt;/i&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;AsParallel&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;WithCancellation&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;token&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt; &lt;i&gt;&lt;span class="sh_usertype"&gt;enumerate&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query&lt;/i&gt; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Calling &lt;code&gt;Cancel&lt;/code&gt; on &lt;code&gt;cancelSource&lt;/code&gt; in this example will cancel the PLINQ query, which will throw an &lt;code&gt;OperationCanceledException&lt;/code&gt; on the task body, which will then cancel the task.&lt;br /&gt;&lt;div class="note"&gt;The cancellation tokens that you can pass into methods such as &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;CancelAndWait&lt;/code&gt; allow you to cancel the &lt;em&gt;wait&lt;/em&gt; operation and not the task itself.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Continuations"&gt;Continuations&lt;/a&gt; &lt;/h2&gt;Sometimes it’s useful to start a task right after another one completes (or fails). The &lt;code&gt;ContinueWith&lt;/code&gt; method on the &lt;code&gt;Task&lt;/code&gt; class does exactly this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"antecedant.."&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"..continuation"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;As soon as &lt;code&gt;task1&lt;/code&gt; (the &lt;i&gt;antecedent&lt;/i&gt;) finishes, fails, or is canceled, &lt;code&gt;task2&lt;/code&gt; (the &lt;i&gt;continuation&lt;/i&gt;) automatically starts. (If &lt;code&gt;task1&lt;/code&gt; had completed before the second line of code ran, &lt;code&gt;task2&lt;/code&gt; would be scheduled to execute right away.) The &lt;code&gt;ant&lt;/code&gt; argument passed to the continuation’s lambda expression is a reference to the antecedent task.&lt;br /&gt;Our example demonstrated the simplest kind of continuation, and is functionally similar to the following:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"antecedent.."&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"..continuation"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;The continuation-based approach, however, is more flexible in that you could first wait on &lt;code&gt;task1&lt;/code&gt;, and then later wait on &lt;code&gt;task2&lt;/code&gt;. This is particularly useful if &lt;code&gt;task1&lt;/code&gt; returns data.&lt;br /&gt;&lt;div class="note"&gt;Another (subtler) difference is that by default, antecedent and continuation tasks may execute on different threads. You can force them to execute on the same thread by specifying &lt;code&gt;TaskContinuationOptions.ExecuteSynchronously&lt;/code&gt; when calling &lt;code&gt;ContinueWith&lt;/code&gt;: this can improve performance in very fine-grained continuations by lessening indirection.&lt;/div&gt;&lt;h3&gt;Continuations and Task&lt;tresult&gt;&lt;/tresult&gt;&lt;/h3&gt;Just like ordinary tasks, continuations can be of type &lt;code&gt;Task&lt;tresult&gt;&lt;/tresult&gt;&lt;/code&gt; and return data. In the following example, we calculate &lt;code&gt;Math.Sqrt(8*2)&lt;/code&gt; using a series of chained tasks and then write out the result:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;StartNew&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;8&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result &lt;span class="sh_symbol"&gt;*&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Math&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sqrt&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 4&lt;/span&gt;&lt;/pre&gt;Our example is somewhat contrived for simplicity; in real life, these lambda expressions would call computationally intensive functions.&lt;br /&gt;&lt;h3&gt;  &lt;a href="" name="_Continuations_and_exceptions"&gt;Continuations and exceptions&lt;/a&gt; &lt;/h3&gt;A continuation can find out if an exception was thrown by the antecedent via the antecedent task’s &lt;code&gt;Exception&lt;/code&gt; property. The following writes the details of a &lt;code&gt;NullReferenceException&lt;/code&gt; to the console:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;&lt;div class="warning"&gt;If an antecedent throws and the continuation fails to query the antecedent’s &lt;code&gt;Exception&lt;/code&gt; property (and the antecedent isn’t otherwise waited upon), the exception is considered unhandled and the application dies (unless handled by &lt;code&gt;TaskScheduler.UnobservedTaskException&lt;/code&gt;).&lt;/div&gt;A safe pattern is to rethrow antecedent exceptions. As long as the continuation is &lt;code&gt;Wait&lt;/code&gt;ed upon, the exception will be propagated and rethrown to the &lt;code&gt;Wait&lt;/code&gt;er:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;continuation &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;StartNew &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &amp;nbsp;&lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception &lt;span class="sh_symbol"&gt;!=&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Continue processing...&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;continuation&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Exception is now thrown back to caller.&lt;/span&gt;&lt;/pre&gt;Another way to deal with exceptions is to specify different continuations for exceptional versus nonexceptional outcomes. This is done with &lt;code&gt;TaskContinuationOptions&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;error &lt;span class="sh_symbol"&gt;=&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;OnlyOnFaulted&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ok &lt;span class="sh_symbol"&gt;=&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Success!"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;b&gt;TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;NotOnFaulted&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;This pattern is particularly useful in conjunction with &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;child tasks&lt;/a&gt;, as we’ll &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations_and_child_tasks"&gt;see very soon&lt;/a&gt;.&lt;br /&gt;The following extension method “swallows” a task’s unhandled exceptions:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;IgnoreExceptions&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;this&lt;/span&gt; &lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;t &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ignore &lt;span class="sh_symbol"&gt;=&lt;/span&gt; t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;OnlyOnFaulted&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt; &lt;/pre&gt;(This could be improved by adding code to log the exception.) Here’s how it would be used:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;IgnoreExceptions&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;&lt;h3&gt;  &lt;a href="" name="_Continuations_and_child_tasks"&gt;Continuations and child tasks&lt;/a&gt; &lt;/h3&gt;A powerful feature of continuations is that they kick off only when all &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;child tasks&lt;/a&gt; have completed. At that point, any exceptions thrown by the children are marshaled to the continuation.&lt;br /&gt;In the following example, we start three child tasks, each throwing a &lt;code&gt;NullReferenceException&lt;/code&gt;. We then catch all of them in one fell swoop via a continuation on the parent:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;TaskCreationOptions&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;atp &lt;span class="sh_symbol"&gt;=&lt;/span&gt; TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;AttachedToParent&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; atp&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; atp&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; atp&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;p &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;p&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Exception&lt;span class="sh_symbol"&gt;),&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;TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;OnlyOnFaulted&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;div class="figure"&gt;  &lt;img alt="Continuations" height="503" src="http://www.albahari.com/threading/Continuations.png" width="650" /&gt; &lt;/div&gt;&lt;h3&gt;Conditional continuations&lt;/h3&gt;By default, a continuation is scheduled &lt;em&gt;unconditionally&lt;/em&gt; — whether the antecedent completes, throws an exception, or is canceled. You can alter this behavior via a set of (combinable) flags included within the &lt;code&gt;TaskContinuationOptions&lt;/code&gt; enum. The three core flags that control conditional continuation are:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;NotOnRanToCompletion &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0x10000&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;NotOnFaulted &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0x20000&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;NotOnCanceled &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0x40000&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;/pre&gt;These flags are subtractive in the sense that the more you apply, the less likely the continuation is to execute. For convenience, there are also the following precombined values:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;OnlyOnRanToCompletion&lt;/b&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; NotOnFaulted &lt;span class="sh_symbol"&gt;|&lt;/span&gt; NotOnCanceled&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;b&gt;OnlyOnFaulted&lt;/b&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; NotOnRanToCompletion &lt;span class="sh_symbol"&gt;|&lt;/span&gt; NotOnCanceled&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;b&gt;OnlyOnCanceled&lt;/b&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; NotOnRanToCompletion &lt;span class="sh_symbol"&gt;|&lt;/span&gt; NotOnFaulted&lt;/pre&gt;(Combining all the &lt;code&gt;Not*&lt;/code&gt; flags [&lt;code&gt;NotOnRanToCompletion&lt;/code&gt;, &lt;code&gt;NotOnFaulted&lt;/code&gt;, &lt;code&gt;NotOnCanceled&lt;/code&gt;] is nonsensical, as it would result in the continuation always being canceled.)&lt;br /&gt;“RanToCompletion” means the antecedent succeeded — without cancellation or unhandled exceptions.&lt;br /&gt;“Faulted” means an unhandled exception was thrown on the antecedent.&lt;br /&gt;“Canceled” means one of two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The antecedent was canceled via its cancellation token. In other words, an &lt;code&gt;OperationCanceledException&lt;/code&gt; was thrown on the antecedent — whose &lt;code&gt;CancellationToken&lt;/code&gt; property matched that passed to the antecedent when it was started.&lt;/li&gt;&lt;li&gt;The antecedent was implicitly canceled because &lt;em&gt;it&lt;/em&gt; didn’t satisfy a conditional continuation predicate.&lt;/li&gt;&lt;/ul&gt;It’s essential to grasp that when a continuation doesn’t execute by virtue of these flags, the continuation is not forgotten or abandoned — it’s &lt;em&gt;canceled&lt;/em&gt;. This means that any continuations on the continuation itself &lt;em&gt;will then run&lt;/em&gt; — unless you predicate them with &lt;code&gt;NotOnCanceled&lt;/code&gt;. For example, consider this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(...);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;fault &lt;span class="sh_symbol"&gt;=&lt;/span&gt; t1&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"fault"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;OnlyOnFaulted&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t3 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; fault&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"t3"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;As it stands, &lt;code&gt;t3&lt;/code&gt; will always get scheduled — even if &lt;code&gt;t1&lt;/code&gt; doesn’t throw an exception. This is because if &lt;code&gt;t1&lt;/code&gt; succeeds, the &lt;code&gt;fault&lt;/code&gt; task will be &lt;em&gt;canceled&lt;/em&gt;, and with no continuation restrictions placed on &lt;code&gt;t3&lt;/code&gt;, &lt;code&gt;t3&lt;/code&gt; will then execute unconditionally.&lt;br /&gt;&lt;div class="figure"&gt;  &lt;img alt="Conditional Continuations" height="110" src="http://www.albahari.com/threading/ConditionalContinuations.png" width="650" /&gt; &lt;/div&gt;If we want &lt;code&gt;t3&lt;/code&gt; to execute only if &lt;code&gt;fault&lt;/code&gt; actually runs, we must instead do this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t3 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; fault&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"t3"&lt;/span&gt;&lt;span class="sh_symbol"&gt;),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;NotOnCanceled&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;(Alternatively, we could specify &lt;code&gt;OnlyOnRanToCompletion&lt;/code&gt;; the difference is that &lt;code&gt;t3&lt;/code&gt; would not then execute if an exception was thrown within &lt;code&gt;fault&lt;/code&gt;.)&lt;br /&gt;&lt;h3&gt;  &lt;a href="" name="_Continuations_with_multiple_antecedents"&gt;Continuations with multiple antecedents&lt;/a&gt; &lt;/h3&gt;Another useful feature of continuations is that you can schedule them to execute based on the completion of multiple antecedents. &lt;code&gt;ContinueWhenAll&lt;/code&gt; schedules execution when all antecedents have completed; &lt;code&gt;ContinueWhenAny&lt;/code&gt; schedules execution when one antecedent completes. Both methods are defined in the &lt;code&gt;TaskFactory&lt;/code&gt; class:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"X"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Y"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;continuation &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWhenAll&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;,&lt;/span&gt; task2 &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; tasks &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Done"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;This writes “Done” after writing “XY” or “YX”. The &lt;code&gt;tasks&lt;/code&gt; argument in the lambda expression gives you access to the array of completed tasks, which is useful when the antecedents return data. The following example adds together numbers returned from two antecedent tasks: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_comment"&gt;// task1 and task2 would call complex functions in real life:&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;456&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task3 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;b&gt;&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWhenAll&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; task1&lt;span class="sh_symbol"&gt;,&lt;/span&gt; task2 &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; tasks &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; tasks&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sum&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;t &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;task3&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 579&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;We’ve included the &lt;code&gt;&lt;int&gt;&lt;/int&gt;&lt;/code&gt; type argument in our call to &lt;code&gt;Task.Factory&lt;/code&gt; in this example to clarify that we’re obtaining a generic task factory. The type argument is unnecessary, though, as it will be inferred by the compiler.&lt;/div&gt;&lt;h3&gt;Multiple continuations on a single antecedent&lt;/h3&gt;Calling &lt;code&gt;ContinueWith&lt;/code&gt; more than once on the same task creates multiple continuations on a single antecedent. When the antecedent finishes, all continuations will start together (unless you specify &lt;code&gt;TaskContinuationOptions.ExecuteSynchronously&lt;/code&gt;, in which case the continuations will execute sequentially).&lt;br /&gt;The following waits for one second, and then writes either “XY” or “YX”:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sleep&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1000&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"X"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Write&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Y"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;&lt;h2&gt;  &lt;a href="" name="_Task_Schedulers_and_UIs"&gt;Task Schedulers and UIs &lt;/a&gt; &lt;/h2&gt;A &lt;i&gt;task scheduler&lt;/i&gt; allocates tasks to threads. All tasks are associated with a task scheduler, which is represented by the abstract &lt;code&gt;TaskScheduler&lt;/code&gt; class. The Framework provides two concrete implementations: the &lt;em&gt;default scheduler&lt;/em&gt; that works in tandem with the &lt;a href="http://www.albahari.com/threading/#_Thread_Pooling"&gt;CLR thread pool&lt;/a&gt;, and the &lt;i&gt;synchronization context scheduler&lt;/i&gt;. The latter is designed (primarily) to help you with the threading model of WPF and Windows Forms, which requires that UI elements and controls are accessed &lt;a href="http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications"&gt;only from the thread that created them&lt;/a&gt;. For example, suppose we wanted to fetch some data from a web service in the background, and then update a WPF label called &lt;code&gt;lblResult&lt;/code&gt; with its result. We can divide this into two tasks:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Call a method to get data from the web service (antecedent task).&lt;/li&gt;&lt;li&gt;Update &lt;code&gt;lblResult&lt;/code&gt; with the results (&lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuation&lt;/a&gt; task).&lt;/li&gt;&lt;/ol&gt;If, for a &lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;continuation task&lt;/a&gt;, we specify the &lt;em&gt;synchronization context scheduler&lt;/em&gt; obtained when the window was constructed, we can safely update &lt;code&gt;lblResult&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;partial&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;MyWindow&lt;/span&gt; &lt;span class="sh_symbol"&gt;:&lt;/span&gt; Window&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; TaskScheduler _uiScheduler&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Declare this as a field so we can use&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// it throughout our class.&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;MyWindow&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_function"&gt;InitializeComponent&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Get the UI scheduler for the thread that created the form:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _uiScheduler &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;b&gt;TaskScheduler&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;FromCurrentSynchronizationContext&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;StartNew&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;SomeComplexWebService&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ContinueWith&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ant &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; lblResult&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Content &lt;span class="sh_symbol"&gt;=&lt;/span&gt; ant&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;b&gt;_uiScheduler&lt;/b&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;string&lt;/span&gt; &lt;span class="sh_function"&gt;SomeComplexWebService&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_symbol"&gt;...&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;It’s also possible to write our own task scheduler (by subclassing &lt;code&gt;TaskScheduler&lt;/code&gt;), although this is something you’d do only in very specialized scenarios. For custom scheduling, you’d more commonly use &lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskCompletionSource"&gt;TaskCompletionSource&lt;/a&gt;, which we’ll cover soon.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_TaskFactory"&gt;TaskFactory&lt;/a&gt; &lt;/h2&gt;When you call &lt;code&gt;Task.Factory&lt;/code&gt;, you’re calling a static property on &lt;code&gt;Task&lt;/code&gt; that returns a default &lt;code&gt;TaskFactory&lt;/code&gt; object. The purpose of a task factory is to create tasks — specifically, three kinds of tasks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;“Ordinary” tasks (via &lt;code&gt;StartNew&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Continuations with multiple antecedents (via &lt;code&gt;ContinueWhenAll&lt;/code&gt; and &lt;code&gt;ContinueWhenAny&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Tasks that wrap methods that follow the asynchronous programming model (via &lt;code&gt;FromAsync&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;div class="note"&gt;Interestingly, &lt;code&gt;TaskFactory&lt;/code&gt; is the &lt;em&gt;only&lt;/em&gt; way to achieve the latter two goals. In the case of &lt;code&gt;StartNew&lt;/code&gt;, &lt;code&gt;TaskFactory&lt;/code&gt; is purely a convenience and technically redundant in that you can simply instantiate &lt;code&gt;Task&lt;/code&gt; objects and call &lt;code&gt;Start&lt;/code&gt; on them.&lt;/div&gt;&lt;h3&gt;Creating your own task factories&lt;/h3&gt;&lt;code&gt;TaskFactory&lt;/code&gt; is not an &lt;em&gt;abstract&lt;/em&gt; factory: you can actually instantiate the class, and this is useful when you want to repeatedly create tasks using the same (nonstandard) values for &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_TaskCreationOptions"&gt;TaskCreationOptions&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations_and_exceptions"&gt;TaskContinuationOptions&lt;/a&gt;&lt;/code&gt;, or &lt;code&gt;TaskScheduler&lt;/code&gt;. For example, if we wanted to repeatedly create long-running &lt;em&gt;parented&lt;/em&gt; tasks, we could create a custom factory as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;factory &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;TaskFactory&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp; TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;LongRunning &lt;span class="sh_symbol"&gt;|&lt;/span&gt; TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;AttachedToParent&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp; TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;None&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;Creating tasks is then simply a matter of calling &lt;code&gt;StartNew&lt;/code&gt; on the factory:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Method1&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Method2&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;/pre&gt;The custom continuation options are applied when calling &lt;code&gt;ContinueWhenAll&lt;/code&gt; and &lt;code&gt;ContinueWhenAny&lt;/code&gt;.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_TaskCompletionSource"&gt;TaskCompletionSource&lt;/a&gt; &lt;/h2&gt;The &lt;code&gt;Task&lt;/code&gt; class achieves two distinct things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It schedules a delegate to run on a pooled thread.&lt;/li&gt;&lt;li&gt;It offers a rich set of features for managing work items (continuations, child tasks, exception marshaling, etc.).&lt;/li&gt;&lt;/ul&gt;Interestingly, these two things are not joined at the hip: you can leverage a task’s features for managing work items without scheduling anything to run on the thread pool. The class that enables this pattern of use is called &lt;code&gt;TaskCompletionSource&lt;/code&gt;.&lt;br /&gt;To use &lt;code&gt;TaskCompletionSource&lt;/code&gt; you simply instantiate the class. It exposes a &lt;code&gt;Task&lt;/code&gt; property that returns a task upon which you can wait and attach continuations—just like any other task. The task, however, is entirely controlled by the &lt;code&gt;TaskCompletionSource&lt;/code&gt; object via the following methods:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;TaskCompletionSource&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;TResult&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;SetResult&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;TResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;result&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;SetException&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Exception&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;exception&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;SetCanceled&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; &lt;span class="sh_function"&gt;TrySetResult&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;TResult&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;result&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; &lt;span class="sh_function"&gt;TrySetException&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Exception&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;exception&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; &lt;span class="sh_function"&gt;TrySetCanceled&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;If called more than once, &lt;code&gt;SetResult&lt;/code&gt;, &lt;code&gt;SetException&lt;/code&gt;, or &lt;code&gt;SetCanceled&lt;/code&gt; throws an exception; the &lt;code&gt;Try*&lt;/code&gt; methods instead return  &lt;code&gt;false&lt;/code&gt;.&lt;br /&gt;&lt;div class="note"&gt;  &lt;code&gt;TResult&lt;/code&gt; corresponds to the task’s result type, so &lt;code&gt;TaskCompletionSource&lt;int&gt;&lt;/int&gt;&lt;/code&gt; gives you a &lt;code&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/code&gt;. If you want a task with no result, create a &lt;code&gt;TaskCompletionSource&lt;/code&gt; of &lt;code&gt;object&lt;/code&gt; and pass in &lt;code&gt;null&lt;/code&gt; when calling &lt;code&gt;SetResult&lt;/code&gt;. You can then cast the &lt;code&gt;Task&lt;object&gt;&lt;/object&gt;&lt;/code&gt; to &lt;code&gt;Task&lt;/code&gt;.&lt;/div&gt;The following example prints 123 after waiting for five seconds:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;source &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; TaskCompletionSource&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Thread&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sleep&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;5000&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt; source&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SetResult&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Start&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;int&gt;&lt;/int&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; source&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Task&lt;span class="sh_symbol"&gt;;&lt;/span&gt;      &lt;span class="sh_comment"&gt;// Our "slave" task.&lt;/span&gt;&lt;br /&gt;Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Result&lt;span class="sh_symbol"&gt;);&lt;/span&gt;   &lt;span class="sh_comment"&gt;// 123 &lt;/span&gt;&lt;/pre&gt;Later on, we'll show how &lt;code&gt;BlockingCollection&lt;/code&gt; can be used to &lt;a href="http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT"&gt;write a producer/consumer queue&lt;/a&gt;. We then demonstrate how &lt;code&gt;TaskCompletionSource&lt;/code&gt; improves the solution by allowing queued work items to be waited upon and canceled.&lt;br /&gt;&lt;h1&gt;  &lt;a href="" name="_Working_with_AggregateException"&gt;Working with AggregateException&lt;/a&gt; &lt;/h1&gt;As we’ve seen, &lt;a href="http://www.albahari.com/threading/part5.aspx#_PLINQ"&gt;PLINQ&lt;/a&gt;, the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_The_Parallel_Class"&gt;Parallel&lt;/a&gt;&lt;/code&gt; class, and &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;Tasks&lt;/a&gt;&lt;/code&gt; automatically marshal exceptions to the consumer. To see why this is essential, consider the following LINQ query, which throws a &lt;code&gt;DivideByZeroException&lt;/code&gt; on the first iteration:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; from i &lt;span class="sh_keyword"&gt;in&lt;/span&gt; Enumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&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; select &lt;span class="sh_number"&gt;100&lt;/span&gt; &lt;span class="sh_symbol"&gt;/&lt;/span&gt; i&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;DivideByZeroException&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;If we asked PLINQ to parallelize this query and it ignored the handling of exceptions, a &lt;code&gt;DivideByZeroException&lt;/code&gt; would probably be thrown on a &lt;em&gt;separate thread&lt;/em&gt;, bypassing our &lt;code&gt;catch&lt;/code&gt; block and causing the application to die.&lt;br /&gt;Hence, exceptions are automatically caught and rethrown to the caller. But unfortunately, it’s not quite as simple as catching a &lt;code&gt;DivideByZeroException&lt;/code&gt;. Because these libraries leverage many threads, it’s actually possible for two or more exceptions to be thrown simultaneously. To ensure that all exceptions are reported, exceptions are therefore wrapped in an &lt;code&gt;AggregateException&lt;/code&gt; container, which exposes an &lt;code&gt;InnerExceptions&lt;/code&gt; property containing each of the caught exception(s):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;query &lt;span class="sh_symbol"&gt;=&lt;/span&gt; from i &lt;span class="sh_keyword"&gt;in&lt;/span&gt; ParallelEnumerable&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Range&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&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; select &lt;span class="sh_number"&gt;100&lt;/span&gt; &lt;span class="sh_symbol"&gt;/&lt;/span&gt; i&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// Enumerate query&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;aex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Exception ex &lt;span class="sh_keyword"&gt;in&lt;/span&gt; aex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;InnerExceptions&lt;/b&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Message&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;Both PLINQ and the &lt;code&gt;Parallel&lt;/code&gt; class end the query or loop execution upon encountering the first exception — by not processing any further elements or loop bodies. More exceptions might be thrown, however, before the current cycle is complete. The first exception in &lt;code&gt;AggregateException&lt;/code&gt; is visible in the &lt;code&gt;InnerException&lt;/code&gt; property.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_Flatten_and_Handle"&gt;Flatten and Handle&lt;/a&gt; &lt;/h2&gt;The &lt;code&gt;AggregateException&lt;/code&gt; class provides a couple of methods to simplify exception handling: &lt;code&gt;Flatten&lt;/code&gt; and &lt;code&gt;Handle&lt;/code&gt;.&lt;br /&gt;&lt;h3&gt;Flatten&lt;/h3&gt;&lt;code&gt;AggregateException&lt;/code&gt;s will quite often contain other &lt;code&gt;AggregateException&lt;/code&gt;s. An example of when this might happen is if a &lt;a href="http://www.albahari.com/threading/part5.aspx#_Child_tasks"&gt;child task&lt;/a&gt; throws an exception. You can eliminate any level of nesting to simplify handling by calling &lt;code&gt;Flatten&lt;/code&gt;. This method returns a new &lt;code&gt;AggregateException&lt;/code&gt; with a simple flat list of inner exceptions:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;aex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Exception ex &lt;span class="sh_keyword"&gt;in&lt;/span&gt; aex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;Flatten&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;InnerExceptions&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myLogWriter&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;LogException&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;h3&gt;Handle&lt;/h3&gt;Sometimes it’s useful to catch only specific exception types, and have other types rethrown. The &lt;code&gt;Handle&lt;/code&gt; method on &lt;code&gt;AggregateException&lt;/code&gt; provides a shortcut for doing this. It accepts an exception predicate which it runs over every inner exception: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Handle&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Func&lt;exception, bool=""&gt;&lt;/exception,&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;predicate&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/pre&gt;If the predicate returns &lt;code&gt;true&lt;/code&gt;, it considers that exception “handled.” After the delegate has run over every exception, the following happens:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If all exceptions were “handled” (the delegate returned &lt;code&gt;true&lt;/code&gt;), the exception is not rethrown.&lt;/li&gt;&lt;li&gt;If there were any exceptions for which the delegate returned &lt;code&gt;false&lt;/code&gt; (“unhandled”), a new &lt;code&gt;AggregateException&lt;/code&gt; is built up containing those exceptions, and is rethrown.&lt;/li&gt;&lt;/ul&gt;For instance, the following ends up rethrowing another &lt;code&gt;AggregateException&lt;/code&gt; that contains a single &lt;code&gt;NullReferenceException&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;parent &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// We’ll throw 3 exceptions at once using 3 child tasks:&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;childFactory &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; TaskFactory&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;TaskCreationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;AttachedToParent&lt;span class="sh_symbol"&gt;,&lt;/span&gt; TaskContinuationOptions&lt;span class="sh_symbol"&gt;.&lt;/span&gt;None&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; childFactory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;5&lt;/span&gt; &lt;span class="sh_symbol"&gt;/&lt;/span&gt; numbers&lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;]);&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span class="sh_comment"&gt;// Division by zero&lt;/span&gt;&lt;br /&gt;&amp;nbsp; childFactory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; numbers &lt;span class="sh_symbol"&gt;[&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;]);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="sh_comment"&gt;// Index out of range&lt;/span&gt;&lt;br /&gt;&amp;nbsp; childFactory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;throw&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &amp;nbsp;&lt;span class="sh_comment"&gt;// Null reference&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; parent&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;AggregateException&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;aex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;aex&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Flatten&lt;/span&gt;&lt;span class="sh_symbol"&gt;().&lt;/span&gt;&lt;span class="sh_function"&gt;Handle&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Note that we still need to call Flatten&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex &lt;span class="sh_keyword"&gt;is&lt;/span&gt; DivideByZeroException&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Divide by zero"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// This exception is "handled"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex &lt;span class="sh_keyword"&gt;is&lt;/span&gt; IndexOutOfRangeException&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Index out of range"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// This exception is "handled"&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;span class="sh_keyword"&gt;false&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// All other exceptions will get rethrown&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;h1&gt;  &lt;a href="" name="_Concurrent_Collections"&gt;Concurrent Collections&lt;/a&gt; &lt;/h1&gt;Framework 4.0 provides a set of new collections in the &lt;code&gt;System.Collections.Concurrent&lt;/code&gt; namespace. All of these are fully thread-safe:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;th valign="top"&gt;Concurrent collection&lt;/th&gt;   &lt;th valign="top"&gt;Nonconcurrent equivalent&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;ConcurrentStack&lt;t&gt;&lt;/t&gt;&lt;/code&gt;   &lt;/td&gt;    &lt;td valign="top"&gt;    &lt;code&gt;Stack&lt;t&gt;&lt;/t&gt;&lt;/code&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;ConcurrentQueue&lt;t&gt;&lt;/t&gt;&lt;/code&gt;    &lt;/td&gt;   &lt;td valign="top"&gt;    &lt;code&gt;Queue&lt;t&gt;&lt;/t&gt;&lt;/code&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;a href="http://www.albahari.com/threading/part5.aspx#_ConcurrentBagT"&gt;&lt;code&gt;ConcurrentBag&lt;t&gt;&lt;/t&gt;&lt;/code&gt;&lt;/a&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;(none)&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;a href="http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT"&gt;BlockingCollection&lt;t&gt;&lt;/t&gt;&lt;/a&gt;   &lt;/td&gt;    &lt;td valign="top"&gt;(none)&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;    &lt;code&gt;ConcurrentDictionary&lt;tkey,tvalue&gt;&lt;/tkey,tvalue&gt;&lt;/code&gt;   &lt;/td&gt;   &lt;td valign="top"&gt;    &lt;code&gt;Dictionary&lt;tkey,tvalue&gt;&lt;/tkey,tvalue&gt;&lt;/code&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The concurrent collections can sometimes be useful in general multithreading when you need a thread-safe collection. However, there are some caveats:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The concurrent collections are tuned for &lt;em&gt;parallel programming&lt;/em&gt;. The conventional collections outperform them in all but highly concurrent scenarios.&lt;/li&gt;&lt;li&gt;A thread-safe collection doesn’t guarantee that &lt;a href="http://www.albahari.com/threading/part2.aspx#_Thread_Safety_and_NET_Framework_Types"&gt;the code using it will be thread-safe&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;If you enumerate over a concurrent collection while another thread is modifying it, no exception is thrown. Instead, you get a mixture of old and new content.&lt;/li&gt;&lt;li&gt;There’s no concurrent version of &lt;code&gt;List&lt;t&gt;&lt;/t&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;The concurrent stack, queue, and bag classes are implemented internally with linked lists. This makes them less memory-efficient than the nonconcurrent &lt;code&gt;Stack&lt;/code&gt; and &lt;code&gt;Queue&lt;/code&gt; classes, but better for concurrent access because linked lists are conducive to lock-free or low-lock implementations. (This is because inserting a node into a linked list requires updating just a couple of references, while inserting an element into a &lt;code&gt;List&lt;t&gt;&lt;/t&gt;&lt;/code&gt;-like structure may require moving thousands of existing elements.)&lt;/li&gt;&lt;/ul&gt;In other words, these collections don’t merely provide shortcuts for using an ordinary collection with a lock. To demonstrate, if we execute the following code on a &lt;em&gt;single&lt;/em&gt; thread:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;d &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; ConcurrentDictionary&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt; d&lt;span class="sh_symbol"&gt;[&lt;/span&gt;i&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;it runs three times more slowly than this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;d &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; Dictionary&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sh_number"&gt;1000000&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt; &lt;b&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;d&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt; d&lt;span class="sh_symbol"&gt;[&lt;/span&gt;i&lt;span class="sh_symbol"&gt;]&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;(&lt;em&gt;Reading&lt;/em&gt; from a &lt;code&gt;ConcurrentDictionary&lt;/code&gt;, however, is fast because reads are lock-free.)&lt;br /&gt;The concurrent collections also differ from conventional collections in that they expose special methods to perform atomic test-and-act operations, such as &lt;code&gt;TryPop&lt;/code&gt;. Most of these methods are unified via the &lt;code&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt; interface.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_IProducerConsumerCollectionT"&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/a&gt; &lt;/h2&gt;A producer/consumer collection is one for which the two primary use cases are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adding an element (“producing”)&lt;/li&gt;&lt;li&gt;Retrieving an element while removing it (“consuming”)&lt;/li&gt;&lt;/ul&gt;The classic examples are stacks and queues. Producer/consumer collections are significant in parallel programming because they’re conducive to efficient lock-free implementations.&lt;br /&gt;The &lt;code&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt;  interface represents a thread-safe producer/consumer collection. The following classes implement this interface:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;ConcurrentStack&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;T&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;ConcurrentQueue&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;T&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_ConcurrentBagT"&gt;ConcurrentBag&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;T&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;code&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt; extends &lt;code&gt;ICollection&lt;/code&gt;, adding the following methods:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;CopyTo&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;T&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; array&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; index&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;T&lt;span class="sh_symbol"&gt;[]&lt;/span&gt; &lt;span class="sh_function"&gt;ToArray&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; &lt;span class="sh_function"&gt;TryAdd&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;T&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;item&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; &lt;span class="sh_function"&gt;TryTake&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;out&lt;/span&gt; &lt;span class="sh_usertype"&gt;T&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;item&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;The &lt;code&gt;TryAdd&lt;/code&gt; and &lt;code&gt;TryTake&lt;/code&gt; methods test whether an add/remove operation can be performed, and if so, they perform the add/remove. The testing and acting are performed atomically, eliminating the need to lock as you would around a conventional collection:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; result&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;myStack&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;myStack&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Count &lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; result &lt;span class="sh_symbol"&gt;=&lt;/span&gt; myStack&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Pop&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/pre&gt;&lt;code&gt;TryTake&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt; if the collection is empty. &lt;code&gt;TryAdd&lt;/code&gt; always succeeds and returns &lt;code&gt;true&lt;/code&gt; in the three implementations provided. If you wrote your own concurrent collection that prohibited duplicates, however, you’d make &lt;code&gt;TryAdd&lt;/code&gt; return &lt;code&gt;false&lt;/code&gt; if the element already existed (an example would be if you wrote a concurrent &lt;em&gt;set&lt;/em&gt;).&lt;br /&gt;The particular element that &lt;code&gt;TryTake&lt;/code&gt;  removes is defined by the subclass:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;With a stack, &lt;code&gt;TryTake&lt;/code&gt; removes the most recently added element.&lt;/li&gt;&lt;li&gt;With a queue, &lt;code&gt;TryTake&lt;/code&gt; removes the least recently added element.&lt;/li&gt;&lt;li&gt;With a bag, &lt;code&gt;TryTake&lt;/code&gt; removes whatever element it can remove most efficiently.&lt;/li&gt;&lt;/ul&gt;The three concrete classes mostly implement the &lt;code&gt;TryTake&lt;/code&gt; and &lt;code&gt;TryAdd&lt;/code&gt; methods explicitly, exposing the same functionality through more specifically named public methods such as &lt;code&gt;TryDequeue&lt;/code&gt; and &lt;code&gt;TryPop&lt;/code&gt;.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_ConcurrentBagT"&gt;ConcurrentBag&lt;t&gt;&lt;/t&gt;&lt;/a&gt; &lt;/h2&gt;&lt;code&gt;ConcurrentBag&lt;t&gt;&lt;/t&gt;&lt;/code&gt; stores an &lt;em&gt;unordered&lt;/em&gt; collection of objects (with duplicates permitted). &lt;code&gt;ConcurrentBag&lt;t&gt;&lt;/t&gt;&lt;/code&gt; is suitable in situations when you &lt;em&gt;don’t care&lt;/em&gt; which element you get when calling &lt;code&gt;Take&lt;/code&gt; or &lt;code&gt;TryTake&lt;/code&gt;.&lt;br /&gt;The benefit of &lt;code&gt;ConcurrentBag&lt;t&gt;&lt;/t&gt;&lt;/code&gt; over a concurrent queue or stack is that a bag’s &lt;code&gt;Add&lt;/code&gt; method suffers almost &lt;em&gt;no&lt;/em&gt; contention when called by many threads at once. In contrast, calling &lt;code&gt;Add&lt;/code&gt; in parallel on a queue or stack incurs &lt;em&gt;some&lt;/em&gt; contention (although a lot less than locking around a &lt;em&gt;nonconcurrent&lt;/em&gt; collection). Calling &lt;code&gt;Take&lt;/code&gt; on a concurrent bag is also very efficient — as long as each thread doesn’t take more elements than it &lt;code&gt;Add&lt;/code&gt;ed.&lt;br /&gt;Inside a concurrent bag, each thread gets it own private linked list. Elements are added to the private list that belongs to the thread calling &lt;code&gt;Add&lt;/code&gt;, eliminating contention. When you enumerate over the bag, the enumerator travels through each thread’s private list, yielding each of its elements in turn.&lt;br /&gt;When you call &lt;code&gt;Take&lt;/code&gt;, the bag first looks at the current thread’s private list. If there’s at least one element, it can complete the task easily and (in most cases) without contention. But if the list is empty, it must “steal” an element from another thread’s private list and incur the potential for contention.&lt;br /&gt;So, to be precise, calling &lt;code&gt;Take&lt;/code&gt; gives you the element added most recently on that thread; if there are no elements on that thread, it gives you the element added most recently on another thread, chosen at random.&lt;br /&gt;Concurrent bags are ideal when the parallel operation on your collection mostly comprises &lt;code&gt;Add&lt;/code&gt;ing elements — or when the &lt;code&gt;Add&lt;/code&gt;s and &lt;code&gt;Take&lt;/code&gt;s are balanced on a thread. We saw an example of the former previously, when using &lt;code&gt;Parallel.ForEach&lt;/code&gt; to implement a parallel spellchecker:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;misspellings &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; ConcurrentBag&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Tuple&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;span class="sh_type"&gt;string&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Parallel&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ForEach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;wordsToTest&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;word&lt;span class="sh_symbol"&gt;,&lt;/span&gt; state&lt;span class="sh_symbol"&gt;,&lt;/span&gt; i&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;wordLookup&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Contains&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;word&lt;span class="sh_symbol"&gt;))&lt;/span&gt;&lt;br /&gt;    misspellings&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Tuple&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Create&lt;/span&gt; &lt;span class="sh_symbol"&gt;((&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; i&lt;span class="sh_symbol"&gt;,&lt;/span&gt; word&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;A concurrent bag would be a poor choice for a producer/consumer queue, because elements are added and removed by &lt;em&gt;different&lt;/em&gt; threads.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_BlockingCollectionT"&gt;BlockingCollection&lt;t&gt;&lt;/t&gt;&lt;/a&gt; &lt;/h2&gt;If you call &lt;code&gt;TryTake&lt;/code&gt; on any of the producer/consumer collections we discussed previously:&lt;br /&gt;&lt;pre&gt;ConcurrentStack&lt;t&gt;&lt;br /&gt;ConcurrentQueue&lt;t&gt;&lt;br /&gt;ConcurrentBag&lt;t&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;and the collection is empty, the method returns &lt;code&gt;false&lt;/code&gt;. Sometimes it would be more useful in this scenario to &lt;em&gt;wait&lt;/em&gt; until an element is available.&lt;br /&gt;Rather than overloading the &lt;code&gt;TryTake&lt;/code&gt; methods with this functionality (which would have caused a blowout of members after allowing for cancellation tokens and timeouts), PFX’s designers encapsulated this functionality into a wrapper class called &lt;code&gt;BlockingCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt;. A blocking collection wraps any collection that implements &lt;a href="http://www.albahari.com/threading/part5.aspx#_IProducerConsumerCollectionT"&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/a&gt; and lets you &lt;code&gt;Take&lt;/code&gt; an element from the wrapped collection — blocking if no element is available.&lt;br /&gt;A blocking collection also lets you limit the total size of the collection, blocking the &lt;em&gt;producer&lt;/em&gt; if that size is exceeded. A collection limited in this manner is called a &lt;i&gt;bounded blocking collection&lt;/i&gt;.&lt;br /&gt;To use &lt;code&gt;BlockingCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Instantiate the class, optionally specifying the &lt;a href="http://www.albahari.com/threading/part5.aspx#_IProducerConsumerCollectionT"&gt;IProducerConsumerCollection&lt;t&gt;&lt;/t&gt;&lt;/a&gt; to wrap and the maximum size (bound) of the collection.&lt;/li&gt;&lt;li&gt;Call &lt;code&gt;Add&lt;/code&gt; or &lt;code&gt;TryAdd&lt;/code&gt; to add elements to the underlying collection.&lt;/li&gt;&lt;li&gt;3.Call &lt;code&gt;Take&lt;/code&gt; or &lt;code&gt;TryTake&lt;/code&gt; to remove (consume) elements from the underlying collection.&lt;/li&gt;&lt;/ol&gt;If you call the constructor without passing in a collection, the class will automatically instantiate a &lt;code&gt;ConcurrentQueue&lt;t&gt;&lt;/t&gt;&lt;/code&gt;. The producing and consuming methods let you specify cancellation tokens and timeouts. &lt;code&gt;Add&lt;/code&gt; and &lt;code&gt;TryAdd&lt;/code&gt; may block if the collection size is bounded; &lt;code&gt;Take&lt;/code&gt; and &lt;code&gt;TryTake&lt;/code&gt; block while the collection is empty.&lt;br /&gt;Another way to consume elements is to call &lt;code&gt;GetConsumingEnumerable&lt;/code&gt;. This returns a (potentially) infinite sequence that yields elements as they become available. You can force the sequence to end by calling &lt;code&gt;CompleteAdding&lt;/code&gt;: this method also prevents further elements from being enqueued.&lt;br /&gt;Previously, we wrote a producer/consumer queue &lt;a href="http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_Queue"&gt;using Wait and Pulse&lt;/a&gt;. Here’s the same class refactored to use &lt;code&gt;BlockingCollection&lt;t&gt;&lt;/t&gt;&lt;/code&gt; (exception handling aside):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;PCQueue&lt;/span&gt; &lt;span class="sh_symbol"&gt;:&lt;/span&gt; IDisposable&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;b&gt;  BlockingCollection&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Action&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; _taskQ &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; BlockingCollection&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;Action&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;PCQueue&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; workerCount&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_comment"&gt;// Create and start a separate Task for each consumer:&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; workerCount&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt;&lt;br /&gt;      Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Consume&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Dispose&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;b&gt;_taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;CompleteAdding&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;EnqueueTask&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;action&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;b&gt;_taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;action&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Consume&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_comment"&gt;// This sequence that we’re enumerating will &lt;/span&gt;&lt;i&gt;&lt;span class="sh_comment"&gt;block&lt;/span&gt;&lt;/i&gt;&lt;span class="sh_comment"&gt; when no elements&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_comment"&gt;// are available and will &lt;/span&gt;&lt;i&gt;&lt;span class="sh_comment"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;span class="sh_comment"&gt; when CompleteAdding is called. &lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Action &lt;span class="sh_usertype"&gt;action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_keyword"&gt;in&lt;/span&gt;&lt;b&gt; _taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;GetConsumingEnumerable&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_function"&gt;action&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;     &lt;span class="sh_comment"&gt;// Perform task.&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Because we didn’t pass anything into &lt;code&gt;BlockingCollection&lt;/code&gt;’s constructor, it instantiated a concurrent queue automatically. Had we passed in a &lt;code&gt;ConcurrentStack&lt;/code&gt;, we’d have ended up with a producer/consumer stack.&lt;br /&gt;&lt;code&gt;BlockingCollection&lt;/code&gt; also provides static methods called &lt;code&gt;AddToAny&lt;/code&gt; and &lt;code&gt;TakeFromAny&lt;/code&gt;, which let you add or take an element while specifying several blocking collections. The action is then honored by the first collection able to service the request. &lt;br /&gt;&lt;h3&gt;Leveraging TaskCompletionSource&lt;/h3&gt;The producer/consumer that we just wrote is inflexible in that we can’t track work items after they’ve been enqueued. It would be nice if we could:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Know when a work item has completed.&lt;/li&gt;&lt;li&gt;Cancel an unstarted work item.&lt;/li&gt;&lt;li&gt;Deal elegantly with any exceptions thrown by a work item.&lt;/li&gt;&lt;/ul&gt;An ideal solution would be to have the &lt;code&gt;EnqueueTask&lt;/code&gt; method return some object giving us the functionality just described. The good news is that a class already exists to do exactly this — the &lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;Task&lt;/a&gt; class. All we need to do is to hijack control of the task via &lt;code&gt;TaskCompletionSource&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;PCQueue&lt;/span&gt; &lt;span class="sh_symbol"&gt;:&lt;/span&gt; IDisposable&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;WorkItem&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;b&gt;&lt;span class="sh_usertype"&gt;TaskCompletionSource&lt;object&gt;&lt;/object&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;TaskSource&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;span class="sh_usertype"&gt;Action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;Action&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; CancellationToken&lt;span class="sh_symbol"&gt;?&lt;/span&gt; CancelToken&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;WorkItem&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_usertype"&gt;TaskCompletionSource&lt;object&gt;&lt;/object&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;taskSource&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_usertype"&gt;Action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;action&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;      CancellationToken&lt;span class="sh_symbol"&gt;?&lt;/span&gt; cancelToken&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;      TaskSource &lt;span class="sh_symbol"&gt;=&lt;/span&gt; taskSource&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;      Action &lt;span class="sh_symbol"&gt;=&lt;/span&gt; action&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;      CancelToken &lt;span class="sh_symbol"&gt;=&lt;/span&gt; cancelToken&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  BlockingCollection&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;WorkItem&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt; _taskQ &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; BlockingCollection&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;WorkItem&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;PCQueue&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; workerCount&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_comment"&gt;// Create and start a separate Task for each consumer:&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; workerCount&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt;&lt;br /&gt;      Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Consume&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Dispose&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; _taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;CompleteAdding&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_function"&gt;EnqueueTask&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;action&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;span class="sh_function"&gt;EnqueueTask&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;action&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_function"&gt;EnqueueTask&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Action&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;action&lt;span class="sh_symbol"&gt;,&lt;/span&gt; CancellationToken&lt;span class="sh_symbol"&gt;?&lt;/span&gt; cancelToken&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;    &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;tcs &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; TaskCompletionSource&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh_type"&gt;object&lt;/span&gt;&lt;span class="sh_symbol"&gt;&amp;gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;    _taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;WorkItem&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;tcs&lt;span class="sh_symbol"&gt;,&lt;/span&gt; action&lt;span class="sh_symbol"&gt;,&lt;/span&gt; cancelToken&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;return&lt;/span&gt; &lt;b&gt;tcs&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Task&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Consume&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;foreach&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;WorkItem &lt;span class="sh_usertype"&gt;workItem&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_keyword"&gt;in&lt;/span&gt; _taskQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;GetConsumingEnumerable&lt;/span&gt;&lt;span class="sh_symbol"&gt;())&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;CancelToken&lt;span class="sh_symbol"&gt;.&lt;/span&gt;HasValue &lt;span class="sh_symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;br /&gt;          workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;CancelToken&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Value&lt;span class="sh_symbol"&gt;.&lt;/span&gt;IsCancellationRequested&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;        workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;TaskSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SetCanceled&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span class="sh_keyword"&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_keyword"&gt;try&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;          workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Action&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;          workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;TaskSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;SetResult&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;null&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;   &lt;span class="sh_comment"&gt;// Indicate completion&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_keyword"&gt;catch&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_usertype"&gt;Exception&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;ex&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;          workItem&lt;span class="sh_symbol"&gt;.&lt;/span&gt;TaskSource&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span class="sh_function"&gt;SetException&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;ex&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;In &lt;code&gt;EnqueueTask&lt;/code&gt;, we enqueue a work item that encapsulates the target delegate and a task completion source — which lets us later control the task that we return to the consumer.&lt;br /&gt;In &lt;code&gt;Consume&lt;/code&gt;, we first check whether a task has been canceled after dequeuing the work item. If not, we run the delegate and then call &lt;code&gt;SetResult&lt;/code&gt; on the task completion source to indicate its completion.&lt;br /&gt;Here’s how we can use this class:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;pcQ &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;PCQueue&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;task &lt;span class="sh_symbol"&gt;=&lt;/span&gt; pcQ&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;EnqueueTask&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Easy!"&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;/pre&gt;We can now wait on &lt;code&gt;task&lt;/code&gt;, perform continuations on it, have exceptions propagate to continuations on parent tasks, and so on. In other words, we’ve got the richness of the task model while, in effect, implementing our own scheduler.&lt;br /&gt;&lt;h1&gt;  &lt;a href="" name="_SpinLock_and_SpinWait"&gt;SpinLock and SpinWait&lt;/a&gt; &lt;/h1&gt;In parallel programming, a brief episode of &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking_Versus_Spinning"&gt;spinning&lt;/a&gt; is often preferable to blocking, as it avoids the cost of context switching and kernel transitions. &lt;code&gt;SpinLock&lt;/code&gt; and &lt;code&gt;SpinWait&lt;/code&gt; are designed to help in such cases. Their main use is in writing custom synchronization constructs.&lt;br /&gt;&lt;div class="warning"&gt;  &lt;code&gt;SpinLock&lt;/code&gt; and &lt;code&gt;SpinWait&lt;/code&gt; are structs and not classes! This design decision was an extreme optimization technique to avoid the cost of indirection and garbage collection. It means that you must be careful not to unintentionally &lt;em&gt;copy&lt;/em&gt; instances — by passing them to another method without the &lt;code&gt;ref&lt;/code&gt; modifier, for instance, or declaring them as &lt;code&gt;readonly&lt;/code&gt; fields. This is particularly important in the case of &lt;code&gt;SpinLock&lt;/code&gt;.&lt;/div&gt;&lt;h2&gt;  &lt;a href="" name="_SpinLock"&gt;SpinLock&lt;/a&gt; &lt;/h2&gt;The &lt;code&gt;SpinLock&lt;/code&gt; struct lets you lock without incurring the cost of a context switch, at the expense of keeping a thread &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking_Versus_Spinning"&gt;spinning&lt;/a&gt; (uselessly busy). This approach is valid in high-contention scenarios when locking will be very brief (e.g., in writing a thread-safe linked list from scratch).&lt;br /&gt;&lt;div class="note"&gt;  If you leave a spinlock contended for too long (we’re talking milliseconds at most), it will yield its time slice, causing a context switch just like an ordinary lock. When rescheduled, it will yield again — in a continual cycle of “spin yielding.” This consumes far fewer CPU resources than outright spinning — but more than blocking.&lt;br /&gt;On a single-core machine, a spinlock will start “spin yielding” immediately if contended.&lt;br /&gt;&lt;/div&gt;Using a &lt;code&gt;SpinLock&lt;/code&gt; is like using an ordinary lock, except:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Spinlocks are structs (as previously mentioned).&lt;/li&gt;&lt;li&gt;Spinlocks are not reentrant, meaning that you cannot call &lt;code&gt;Enter&lt;/code&gt; on the same &lt;code&gt;SpinLock&lt;/code&gt; twice in a row on the same thread. If you violate this rule, it will either throw an exception (if &lt;i&gt;owner tracking&lt;/i&gt; is enabled) or &lt;a href="http://www.albahari.com/threading/part2.aspx#_Deadlocks"&gt;deadlock&lt;/a&gt; (if owner tracking is disabled). You can specify whether to enable owner tracking when constructing the spinlock. Owner tracking incurs a performance hit.&lt;/li&gt;&lt;li&gt;   &lt;code&gt;SpinLock&lt;/code&gt; lets you query whether the lock is taken, via the properties &lt;code&gt;IsHeld&lt;/code&gt; and, if owner tracking is enabled, &lt;code&gt;IsHeldByCurrentThread&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;There’s no equivalent to C#'s &lt;code&gt;lock&lt;/code&gt; statement to provide &lt;code&gt;SpinLock&lt;/code&gt; syntactic sugar.&lt;/li&gt;&lt;/ul&gt;Another difference is that when you call &lt;code&gt;Enter&lt;/code&gt;, you &lt;em&gt;must&lt;/em&gt; follow &lt;a href="http://www.albahari.com/threading/part2.aspx#_lockTaken_overloads"&gt; the robust pattern of providing a &lt;code&gt;lockTaken&lt;/code&gt; argument&lt;/a&gt; (which is nearly always done within a &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;finally&lt;/code&gt;  block).&lt;br /&gt;Here’s an example:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;spinLock &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;SpinLock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;   &lt;span class="sh_comment"&gt;// Enable owner tracking&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; lockTaken &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;false&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;spinLock&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Enter&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; lockTaken&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_comment"&gt;// Do stuff...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;finally&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;lockTaken&lt;span class="sh_symbol"&gt;)&lt;/span&gt; spinLock&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Exit&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;As with an ordinary lock, &lt;code&gt;lockTaken&lt;/code&gt;  will be &lt;code&gt;false&lt;/code&gt; after calling &lt;code&gt;Enter&lt;/code&gt; if (and only if) the &lt;code&gt;Enter&lt;/code&gt; method throws an exception and the lock was not taken. This happens in very rare scenarios (such as &lt;a href="http://www.albahari.com/threading/part4.aspx#_Aborting_Threads"&gt;Abort&lt;/a&gt; being called on the thread, or an &lt;code&gt;OutOfMemoryException&lt;/code&gt; being thrown) and lets you reliably know whether to subsequently call &lt;code&gt;Exit&lt;/code&gt;.&lt;br /&gt;&lt;code&gt;SpinLock&lt;/code&gt; also provides a &lt;code&gt;TryEnter&lt;/code&gt; method which accepts a timeout.&lt;br /&gt;&lt;div class="note"&gt;Given &lt;code&gt;SpinLock&lt;/code&gt;’s ungainly value-type semantics and lack of language support, it’s almost as if they &lt;em&gt;want&lt;/em&gt; you to suffer every time you use it! Think carefully before dismissing &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;an ordinary lock&lt;/a&gt;.&lt;/div&gt;A &lt;code&gt;SpinLock&lt;/code&gt; makes the most sense when writing your own reusable synchronization constructs. Even then, a spinlock is not as useful as it sounds. It still limits concurrency. And it wastes CPU time doing &lt;em&gt;nothing useful&lt;/em&gt;. Often, a better choice is to spend some of that time doing something &lt;em&gt;speculative&lt;/em&gt; — with the help of &lt;code&gt;SpinWait&lt;/code&gt;.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_SpinWait"&gt;SpinWait&lt;/a&gt; &lt;/h2&gt;&lt;code&gt;SpinWait&lt;/code&gt; helps you write lock-free code that &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking_Versus_Spinning"&gt;spins&lt;/a&gt; rather than blocks. It works by implementing safeguards to avoid the dangers of resource starvation and priority inversion that might otherwise arise with spinning. &lt;br /&gt;&lt;div class="warning"&gt;Lock-free programming with &lt;code&gt;SpinWait&lt;/code&gt; is as &lt;em&gt;hardcore&lt;/em&gt; as multithreading gets and is intended for when none of the higher-level constructs will do. A prerequisite is to understand &lt;a href="http://www.albahari.com/threading/part4.aspx#_Nonblocking_Synchronization"&gt;Nonblocking Synchronization&lt;/a&gt;.&lt;/div&gt;&lt;h3&gt;Why we need SpinWait&lt;/h3&gt;Suppose we wrote a spin-based signaling system based purely on a simple flag:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; _proceed&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_comment"&gt;// Spin until another thread sets _proceed to true:&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;_proceed&lt;span class="sh_symbol"&gt;)&lt;/span&gt; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;This would be highly efficient if &lt;code&gt;Test&lt;/code&gt; ran when &lt;code&gt;_proceed&lt;/code&gt; was already true — or if &lt;code&gt;_proceed&lt;/code&gt; became true within a few cycles. But now suppose that &lt;code&gt;_proceed&lt;/code&gt; remained false for several seconds — and that four threads called &lt;code&gt;Test&lt;/code&gt; at once. The spinning would then fully consume a quad-core CPU! This would cause other threads to run slowly (resource starvation) — including the very thread that might eventually set &lt;code&gt;_proceed&lt;/code&gt; to true (priority inversion). The situation is exacerbated on single-core machines, where spinning will nearly &lt;em&gt;always&lt;/em&gt;  cause priority inversion. (And although single-core machines are rare nowadays, single-core &lt;em&gt;virtual machines&lt;/em&gt; are not.)&lt;br /&gt;&lt;code&gt;SpinWait&lt;/code&gt; addresses these problems in two ways. First, it limits CPU-intensive spinning to a set number of iterations, after which it yields its time slice on every spin (by calling &lt;a href="http://www.albahari.com/threading/#_Sleep_And_Yield"&gt;Thread.Yield and Thread.Sleep&lt;/a&gt;), lowering its resource consumption. Second, it detects whether it’s running on a single-core machine, and if so, it yields on every cycle.&lt;br /&gt;&lt;h3&gt;How to use SpinWait&lt;/h3&gt;There are two ways to use &lt;code&gt;SpinWait&lt;/code&gt;. The first is to call its static method, &lt;code&gt;SpinUntil&lt;/code&gt;. This method accepts a predicate (and optionally, a timeout):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; _proceed&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;SpinWait&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SpinUntil&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; _proceed&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;The other (more flexible) way to use &lt;code&gt;SpinWait&lt;/code&gt; is to instantiate the struct and then to call &lt;code&gt;SpinOnce&lt;/code&gt; in a loop:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;bool&lt;/span&gt; _proceed&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;spinWait &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;SpinWait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;_proceed&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;b&gt;spinWait&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SpinOnce&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;The former is a shortcut for the latter.&lt;br /&gt;&lt;h3&gt;How SpinWait works&lt;/h3&gt;In its current implementation, &lt;code&gt;SpinWait&lt;/code&gt; performs CPU-intensive spinning for 10 iterations before yielding. However, it doesn’t return to the caller &lt;em&gt;immediately&lt;/em&gt; after each of those cycles: instead, it calls &lt;code&gt;Thread.SpinWait&lt;/code&gt; to spin via the CLR (and ultimately the operating system) for a set time period. This time period is initially a few tens of nanoseconds, but doubles with each iteration until the 10 iterations are up. This ensures some predictability in the total time spent in the CPU-intensive spinning phase, which the CLR and operating system can tune according to conditions. Typically, it’s in the few-tens-of-microseconds region — small, but more than the cost of a context switch.&lt;br /&gt;On a single-core machine, &lt;code&gt;SpinWait&lt;/code&gt; yields on every iteration. You can test whether &lt;code&gt;SpinWait&lt;/code&gt; will yield on the next spin via the property &lt;code&gt;NextSpinWillYield&lt;/code&gt;.&lt;br /&gt;If a &lt;code&gt;SpinWait&lt;/code&gt; remains in “spin-yielding” mode for long enough (maybe 20 cycles) it will periodically &lt;em&gt;sleep&lt;/em&gt;  for a few milliseconds to further save resources and help other threads progress.&lt;br /&gt;&lt;h3&gt;Lock-free updates with SpinWait and Interlocked.CompareExchange&lt;/h3&gt;&lt;code&gt;SpinWait&lt;/code&gt; in conjunction with &lt;code&gt;Interlocked.CompareExchange&lt;/code&gt; can atomically update fields with a value calculated from the original (read-modify-write). For example, suppose we want to multiply field &lt;em&gt;x&lt;/em&gt; by 10. Simply doing the following is not thread-safe:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; x &lt;span class="sh_symbol"&gt;*&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;for the same reason that incrementing a field is not thread-safe, as we saw in &lt;a href="http://www.albahari.com/threading/part4.aspx#_Nonblocking_Synchronization"&gt;Nonblocking Synchronization&lt;/a&gt;.&lt;br /&gt;The correct way to do this without locks is as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Take a “snapshot” of &lt;em&gt;x&lt;/em&gt; into a local variable.&lt;/li&gt;&lt;li&gt;Calculate the new value (in this case by multiplying the snapshot by 10).&lt;/li&gt;&lt;li&gt;Write the calculated value back &lt;em&gt;if&lt;/em&gt; the snapshot is still up-to-date (this step must be done atomically by calling &lt;code&gt;Interlocked.CompareExchange&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;If the snapshot was stale, &lt;em&gt;spin&lt;/em&gt; and return to step 1.&lt;/li&gt;&lt;/ol&gt;For example:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; x&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;MultiplyXBy&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; factor&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;spinWait &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;SpinWait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_type"&gt;int&lt;/span&gt; snapshot1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; x&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_type"&gt;int&lt;/span&gt; calc &lt;span class="sh_symbol"&gt;=&lt;/span&gt; snapshot1 &lt;span class="sh_symbol"&gt;*&lt;/span&gt; factor&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; snapshot2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;CompareExchange&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; x&lt;span class="sh_symbol"&gt;,&lt;/span&gt; calc&lt;span class="sh_symbol"&gt;,&lt;/span&gt; snapshot1&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;snapshot1 &lt;span class="sh_symbol"&gt;==&lt;/span&gt; snapshot2&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_keyword"&gt;return&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;   &lt;span class="sh_comment"&gt;// No one preempted us.&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;spinWait&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SpinOnce&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;We can improve performance (slightly) by doing away with the call to &lt;a href="http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility"&gt;Thread.MemoryBarrier&lt;/a&gt;. We can get away with this because &lt;code&gt;CompareExchange&lt;/code&gt; generates a memory barrier anyway — so the worst that can happen is an extra spin if &lt;code&gt;snapshot1&lt;/code&gt; happens to read a stale value in its first iteration.&lt;/div&gt;&lt;code&gt;Interlocked.CompareExchange&lt;/code&gt; updates a field with a specified value &lt;em&gt;if&lt;/em&gt; the field’s current value matches the third argument. It then returns the field’s old value, so you can test whether it succeeded by comparing that against the original snapshot. If the values differ, it means that another thread preempted you, in which case you spin and try again.&lt;br /&gt;&lt;code&gt;CompareExchange&lt;/code&gt; is overloaded to work with the &lt;code&gt;object&lt;/code&gt; type too. We can leverage this overload by writing a lock-free update method that works with all reference types:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_usertype"&gt;LockFreeUpdate&lt;t&gt; (ref T field, Func &lt;t, t=""&gt;&lt;/t,&gt;&lt;/t&gt;&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;updateFunction&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;where&lt;/span&gt; T &lt;span class="sh_symbol"&gt;:&lt;/span&gt; &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;spinWait &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;SpinWait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_usertype"&gt;T&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;snapshot1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; field&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_usertype"&gt;T&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;calc &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_function"&gt;updateFunction&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;snapshot1&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span class="sh_usertype"&gt;T&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;snapshot2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;CompareExchange&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; field&lt;span class="sh_symbol"&gt;,&lt;/span&gt; calc&lt;span class="sh_symbol"&gt;,&lt;/span&gt; snapshot1&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;snapshot1 &lt;span class="sh_symbol"&gt;==&lt;/span&gt; snapshot2&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_keyword"&gt;return&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;spinWait&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;SpinOnce&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Here’s how we can use this method to write a thread-safe event without locks (this is, in fact, what the C# 4.0 compiler now does by default with events):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;EventHandler _someDelegate&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;event&lt;/span&gt; EventHandler SomeEvent&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  add    &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_function"&gt;LockFreeUpdate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _someDelegate&lt;span class="sh_symbol"&gt;,&lt;/span&gt; d &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; d &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_keyword"&gt;value&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;  remove &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_function"&gt;LockFreeUpdate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _someDelegate&lt;span class="sh_symbol"&gt;,&lt;/span&gt; d &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; d &lt;span class="sh_symbol"&gt;-&lt;/span&gt; &lt;span class="sh_keyword"&gt;value&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="sidebar"&gt;  &lt;div class="sidebartitle"&gt;SpinWait Versus SpinLock&lt;/div&gt;We could solve these problems instead by wrapping access to the shared field around a &lt;code&gt;SpinLock&lt;/code&gt;. The problem with spin locking, though, is that it allows only one thread to proceed at a time — even though the spinlock (usually) eliminates the context-switching overhead. With &lt;code&gt;SpinWait&lt;/code&gt;, we can proceed speculatively&lt;em&gt;&lt;/em&gt;and &lt;em&gt;assume&lt;/em&gt; no contention. If we do get preempted, we simply try again. Spending CPU time doing something that &lt;em&gt;might&lt;/em&gt; work is better than wasting CPU time in a spinlock!&lt;br /&gt;&lt;/div&gt;Finally, consider the following class:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Test&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  ProgressStatus _status &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;ProgressStatus&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_string"&gt;"Starting"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;ProgressStatus&lt;/span&gt;    &lt;span class="sh_comment"&gt;// Immutable class&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; PercentComplete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;span class="sh_type"&gt;string&lt;/span&gt; StatusMessage&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;    &lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_function"&gt;ProgressStatus&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; percentComplete&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_type"&gt;string&lt;/span&gt; statusMessage&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;      PercentComplete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; percentComplete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;      StatusMessage &lt;span class="sh_symbol"&gt;=&lt;/span&gt; statusMessage&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;We can use our &lt;code&gt;LockFreeUpdate&lt;/code&gt; method to “increment” the &lt;code&gt;PercentComplete&lt;/code&gt; field in &lt;code&gt;_status&lt;/code&gt; as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_function"&gt;LockFreeUpdate&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _status&lt;span class="sh_symbol"&gt;,&lt;/span&gt;&lt;br /&gt;  s &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;ProgressStatus&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;s&lt;span class="sh_symbol"&gt;.&lt;/span&gt;PercentComplete &lt;span class="sh_symbol"&gt;+&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; s&lt;span class="sh_symbol"&gt;.&lt;/span&gt;StatusMessage&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&lt;/pre&gt;Notice that we’re creating a new &lt;code&gt;ProgressStatus&lt;/code&gt; object based on existing values. Thanks to the &lt;code&gt;LockFreeUpdate&lt;/code&gt; method, the act of reading the existing &lt;code&gt;PercentComplete&lt;/code&gt; value, incrementing it, and writing it back can’t get &lt;em&gt;unsafely&lt;/em&gt; preempted: any preemption is reliably detected, triggering a spin and retry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7490533466356532174-3551608234049787092?l=smartprogrammingspot.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartprogrammingspot.blogspot.com/feeds/3551608234049787092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://smartprogrammingspot.blogspot.com/2010/12/threading-in-c-part-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/3551608234049787092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7490533466356532174/posts/default/3551608234049787092'/><link rel='alternate' type='text/html' href='http://smartprogrammingspot.blogspot.com/2010/12/threading-in-c-part-5.html' title='Threading in C# (Part 5)'/><author><name>Bheemsen Singh</name><uri>http://www.blogger.com/profile/11351581087788145016</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_4LvG3ZN9yfY/SElkVX2trSI/AAAAAAAAAGk/09x7dgdP82U/S220/Bh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7490533466356532174.post-7441291674652772718</id><published>2010-12-29T05:37:00.000-08:00</published><updated>2010-12-29T05:37:13.280-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C# 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C#2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><title type='text'>Threading in C# (Part 4)</title><content type='html'>&lt;div class="sectiontitle"&gt;&lt;b&gt;Part 4: Advanced Threading&lt;/b&gt;&lt;/div&gt;&lt;h1&gt;  &lt;a href="" name="_Nonblocking_Synchronization"&gt;Nonblocking Synchronization&lt;/a&gt; &lt;/h1&gt;Earlier, we said that the need for synchronization arises even in the simple case of &lt;a href="http://www.albahari.com/threading/part2.aspx#_When_to_Lock"&gt;assigning or incrementing a field&lt;/a&gt;. Although &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt; can always satisfy this need, a contended lock means that a thread must &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;block&lt;/a&gt;, suffering the overhead of a context switch and the latency of being descheduled, which can be undesirable in highly concurrent and performance-critical scenarios. The .NET Framework’s &lt;i&gt;nonblocking&lt;/i&gt; synchronization constructs can perform simple operations without ever blocking, pausing, or waiting.&lt;br /&gt;&lt;div class="warning"&gt;Writing nonblocking or lock-free multithreaded code properly is tricky! Memory barriers, in particular, are easy to get wrong (the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part4.aspx#_The_volatile_keyword"&gt;volatile keyword&lt;/a&gt;&lt;/code&gt; is even easier to get wrong). Think carefully whether you really need the performance benefits before dismissing ordinary locks. Remember that acquiring and releasing an uncontended lock takes as little as 20ns on a 2010-era desktop.&lt;/div&gt;The nonblocking approaches also work across multiple processes. An example of where this might be useful is in reading and writing process-shared memory.&lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_Memory_Barriers_and_Volatility"&gt;Memory Barriers and Volatility&lt;/a&gt; &lt;/h2&gt;Consider the following example: &lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Foo&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; _answer&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;bool&lt;/span&gt; _complete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;A&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;_answer &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_complete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;B&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_complete&lt;span class="sh_symbol"&gt;)&lt;/span&gt; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_answer&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;If methods &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; ran concurrently on different threads, might it be possible for &lt;code&gt;B&lt;/code&gt; to write “0”? The answer is yes — for the following reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The compiler, CLR, or CPU may &lt;em&gt;reorder&lt;/em&gt; your program's instructions to improve efficiency.&lt;/li&gt;&lt;li&gt;The compiler, CLR, or CPU may introduce caching optimizations such that assignments to variables won't be visible to other threads right away.&lt;/li&gt;&lt;/ul&gt;C# and the runtime are very careful to ensure that such optimizations don’t break ordinary single-threaded code — or multithreaded code that makes proper use of locks. Outside of these scenarios, you must explicitly defeat these optimizations by creating &lt;i&gt;memory barriers&lt;/i&gt; (also called &lt;i&gt;memory fences&lt;/i&gt;) to limit the effects of instruction reordering and read/write caching.&lt;br /&gt;&lt;h3&gt;  &lt;a href="" name="_Full_fences"&gt;Full fences&lt;/a&gt; &lt;/h3&gt;The simplest kind of memory barrier is a &lt;i&gt;full memory barrier&lt;/i&gt; (&lt;i&gt;full fence&lt;/i&gt;) which prevents any kind of instruction reordering or caching around that fence. Calling &lt;code&gt;Thread.MemoryBarrier&lt;/code&gt; generates a full fence; we can fix our example by applying four full fences as follows:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Foo&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; _answer&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;bool&lt;/span&gt; _complete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;A&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;_answer &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Barrier 1&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_complete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Barrier 2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;B&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Barrier 3&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_complete&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Barrier 4&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_answer&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Barriers 1 and 4 prevent this example from writing “0”. Barriers 2 and 3 provide a &lt;em&gt;freshness&lt;/em&gt; guarantee: they ensure that if B ran after A, reading &lt;code&gt;_complete&lt;/code&gt; would evaluate to &lt;code&gt;true&lt;/code&gt;.&lt;br /&gt;A full fence takes around ten nanoseconds on a 2010-era desktop.&lt;br /&gt;&lt;div class="note"&gt;  The following implicitly generate full fences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;C#'s &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt;&lt;/code&gt; statement (&lt;code&gt;Monitor.Enter&lt;/code&gt;/&lt;code&gt;Monitor.Exit&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;All methods on the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part4.aspx#_Interlocked"&gt;Interlocked&lt;/a&gt;&lt;/code&gt; class (we’ll cover these soon)&lt;/li&gt;&lt;li&gt;Asynchronous callbacks that use the thread pool — these include &lt;a href="http://www.albahari.com/threading/#_Asynchronous_delegates"&gt;asynchronous delegates&lt;/a&gt;, APM callbacks, and &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Continuations"&gt;Task continuations&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Setting and waiting on a &lt;a href="http://www.albahari.com/threading/part2.aspx#_Signaling_with_Event_Wait_Handles"&gt;signaling construct&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Anything that relies on signaling, such as starting or waiting on a &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part5.aspx#_Task_Parallelism"&gt;Task&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;By virtue of that last point, the following is thread-safe:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_usertype"&gt;Task&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t &lt;span class="sh_symbol"&gt;=&lt;/span&gt; Task&lt;span class="sh_symbol"&gt;.&lt;/span&gt;Factory&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;StartNew&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt; x&lt;span class="sh_symbol"&gt;++);&lt;/span&gt;&lt;br /&gt;t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;x&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;You don’t necessarily need a full fence with every individual read or write. If we had three &lt;em&gt;answer&lt;/em&gt; fields, our example would still need only four fences:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Foo&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; _answer1&lt;span class="sh_symbol"&gt;,&lt;/span&gt; _answer2&lt;span class="sh_symbol"&gt;,&lt;/span&gt; _answer3&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;bool&lt;/span&gt; _complete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;A&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _answer1 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; _answer2 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;2&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; _answer3 &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _complete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;B&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;if&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_complete&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_answer1 &lt;span class="sh_symbol"&gt;+&lt;/span&gt; _answer2 &lt;span class="sh_symbol"&gt;+&lt;/span&gt; _answer3&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;A good approach is to start by putting memory barriers before and after every instruction that reads or writes a shared field, and then strip away the ones that you don’t need. If you’re uncertain of any, leave them in. Or better: switch back to using locks!&lt;/div&gt;&lt;div class="sidebar"&gt; &lt;div class="sidebartitle"&gt;Do We Really Need Locks and Barriers?&lt;/div&gt;Working with &lt;em&gt;shared writable fields&lt;/em&gt; without locks or fences is asking for trouble. There’s a lot of misleading information on this topic — including the MSDN documentation which states that &lt;code&gt;MemoryBarrier&lt;/code&gt; is required only on multiprocessor systems with weak memory ordering, such as a system employing multiple Itanium processors. We can demonstrate that memory barriers are important on ordinary Intel Core-2 and Pentium processors with the following short program. You’ll need to run it with optimizations enabled and without a debugger (in Visual Studio, select Release Mode in the solution’s configuration manager, and then start without debugging):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Main&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;bool&lt;/span&gt; complete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;false&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_usertype"&gt;var&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;t &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Thread&lt;/span&gt; &lt;span class="sh_symbol"&gt;(()&lt;/span&gt; &lt;span class="sh_symbol"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;bool&lt;/span&gt; toggle &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;false&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;complete&lt;span class="sh_symbol"&gt;)&lt;/span&gt; toggle &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_symbol"&gt;!&lt;/span&gt;toggle&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Start&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Sleep&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_number"&gt;1000&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; complete &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; t&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Join&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Blocks indefinitely&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;This program &lt;em&gt;never terminates&lt;/em&gt; because the &lt;code&gt;complete&lt;/code&gt; variable is cached in a CPU register. Inserting a call to &lt;code&gt;Thread.MemoryBarrier&lt;/code&gt; inside the &lt;code&gt;while&lt;/code&gt; loop (or &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;locking&lt;/a&gt; around reading &lt;code&gt;complete&lt;/code&gt;) fixes the error.&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;  &lt;a href="" name="_The_volatile_keyword"&gt;The volatile keyword&lt;/a&gt; &lt;/h3&gt;Another (more advanced) way to solve this problem is to apply the &lt;code&gt;volatile&lt;/code&gt; keyword to the &lt;code&gt;_complete&lt;/code&gt; field:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;&lt;span class="sh_keyword"&gt;volatile&lt;/span&gt;&lt;/b&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; _complete&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;The &lt;code&gt;volatile&lt;/code&gt; keyword instructs the compiler to generate an &lt;i&gt;acquire-fence&lt;/i&gt; on every read from that field, and a &lt;i&gt;release-fence&lt;/i&gt; on every write to that field. An acquire-fence prevents other reads/writes from being moved &lt;em&gt;before&lt;/em&gt; the fence; a release-fence prevents other reads/writes from being moved &lt;em&gt;after&lt;/em&gt; the fence. These “half-fences” are faster than full fences because they give the runtime and hardware more scope for optimization.&lt;br /&gt;&lt;div class="warning"&gt;  As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the &lt;code&gt;volatile&lt;/code&gt; keyword — so this keyword has no effect on the &lt;em&gt;hardware&lt;/em&gt; if you’re using these processors. However, &lt;code&gt;volatile&lt;/code&gt; &lt;em&gt;does&lt;/em&gt; have an effect on optimizations performed by the compiler and the CLR — as well as on 64-bit AMD and (to a greater extent) Itanium processors. This means that you cannot be more relaxed by virtue of your clients running a particular type of CPU.&lt;br /&gt;(And even if you &lt;em&gt;do&lt;/em&gt; use &lt;code&gt;volatile&lt;/code&gt;, you should still maintain a healthy sense of anxiety, as we’ll see shortly!)&lt;br /&gt;&lt;/div&gt;The effect of applying &lt;code&gt;volatile&lt;/code&gt; to fields can be summarized as follows:&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;th valign="top"&gt;First instruction&lt;/th&gt;   &lt;th valign="top"&gt;Second instruction&lt;/th&gt;   &lt;th valign="top"&gt;Can they be swapped?&lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Read&lt;/td&gt;   &lt;td valign="top"&gt;Read&lt;/td&gt;   &lt;td valign="top"&gt;No&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Read&lt;/td&gt;   &lt;td valign="top"&gt;Write&lt;/td&gt;   &lt;td valign="top"&gt;No&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Write&lt;/td&gt;   &lt;td valign="top"&gt;Write&lt;/td&gt;   &lt;td valign="top"&gt;No (The CLR ensures that write-write operations are never   swapped, even without the &lt;code&gt;volatile&lt;/code&gt; keyword)&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td valign="top"&gt;Write&lt;/td&gt;   &lt;td valign="top"&gt;Read&lt;/td&gt;   &lt;td valign="top"&gt;    &lt;strong&gt;Yes!&lt;/strong&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Notice that applying &lt;code&gt;volatile&lt;/code&gt; doesn’t prevent a write followed by a read from being swapped, and this can create brainteasers. Joe Duffy illustrates the problem well with the following example: if &lt;code&gt;Test1&lt;/code&gt; and &lt;code&gt;Test2&lt;/code&gt; run simultaneously on different threads, it’s possible for &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; to both end up with a value of 0 (despite the use of &lt;code&gt;volatile&lt;/code&gt; on both &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;):&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;IfYouThinkYouUnderstandVolatile&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;volatile&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; x&lt;span class="sh_symbol"&gt;,&lt;/span&gt; y&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test1&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Executed on one thread&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&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;&lt;span class="sh_comment"&gt;// Volatile write (release-fence)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; a &lt;span class="sh_symbol"&gt;=&lt;/span&gt; y&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Volatile read (acquire-fence)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test2&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="sh_comment"&gt;// Executed on another thread&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; y &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;1&lt;/span&gt;&lt;span class="sh_symbol"&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; &lt;span class="sh_comment"&gt;// Volatile write (release-fence)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; b &lt;span class="sh_symbol"&gt;=&lt;/span&gt; x&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Volatile read (acquire-fence)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="warning"&gt;The MSDN documentation states that use of the &lt;code&gt;volatile&lt;/code&gt; keyword ensures that the most up-to-date value is present in the field at all times. This is incorrect, since as we’ve seen, a write followed by a read &lt;em&gt;can&lt;/em&gt; be reordered.&lt;/div&gt;This presents a strong case for avoiding &lt;code&gt;volatile&lt;/code&gt;: even if you understand the subtlety in this example, will other developers working on your code also understand it? A full fence between each of the two assignments in &lt;code&gt;Test1&lt;/code&gt; and &lt;code&gt;Test2&lt;/code&gt; (or a &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt;) solves the problem.&lt;br /&gt;The &lt;code&gt;volatile&lt;/code&gt; keyword is not supported with pass-by-reference arguments or captured local variables: in these cases you must use the &lt;code&gt;VolatileRead&lt;/code&gt; and &lt;code&gt;VolatileWrite&lt;/code&gt; methods.&lt;br /&gt;&lt;h3&gt;VolatileRead and VolatileWrite&lt;/h3&gt;The static &lt;code&gt;VolatileRead&lt;/code&gt; and &lt;code&gt;VolatileWrite&lt;/code&gt; methods in the &lt;code&gt;Thread&lt;/code&gt; class read/write a variable while enforcing (technically, a superset of) the guarantees made by the &lt;code&gt;volatile&lt;/code&gt; keyword. Their implementations are relatively inefficient, though, in that they actually generate full fences. Here are their complete implementations for the integer type:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;VolatileWrite&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; address&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; &lt;span class="sh_keyword"&gt;value&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; address &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;value&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="sh_keyword"&gt;public&lt;/span&gt; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; &lt;span class="sh_function"&gt;VolatileRead&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; address&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_type"&gt;int&lt;/span&gt; num &lt;span class="sh_symbol"&gt;=&lt;/span&gt; address&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt; &lt;span class="sh_keyword"&gt;return&lt;/span&gt; num&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;You can see from this that if you call &lt;code&gt;VolatileWrite&lt;/code&gt; followed by &lt;code&gt;VolatileRead&lt;/code&gt;, no barrier is generated in the middle: this enables the same brainteaser scenario that we saw earlier.&lt;br /&gt;&lt;h3&gt;Memory barriers and locking&lt;/h3&gt;As we said earlier, &lt;code&gt;Monitor.Enter&lt;/code&gt; and &lt;code&gt;Monitor.Exit&lt;/code&gt; both generate full fences. So if we ignore a lock’s mutual exclusion guarantee, we could say that this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;/b&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;i&gt;someField&lt;/i&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_symbol"&gt;...&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;is equivalent to this:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_symbol"&gt;...&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt; &lt;b&gt;Thread&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;MemoryBarrier&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;h2&gt;  &lt;a href="" name="_Interlocked"&gt;Interlocked&lt;/a&gt; &lt;/h2&gt;Use of &lt;a href="http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility"&gt;memory barriers&lt;/a&gt; is not always enough when reading or writing fields in lock-free code. Operations on 64-bit fields, increments, and decrements require the heavier approach of using the &lt;code&gt;Interlocked&lt;/code&gt; helper class. &lt;code&gt;Interlocked&lt;/code&gt; also provides the &lt;code&gt;Exchange&lt;/code&gt; and &lt;code&gt;CompareExchange&lt;/code&gt; methods, the latter enabling lock-free read-modify-write operations, with a little additional coding.&lt;br /&gt;A statement is intrinsically &lt;i&gt;atomic&lt;/i&gt; if it executes as a single indivisible instruction on the underlying processor. Strict atomicity precludes any possibility of preemption. A simple read or write on a field of 32 bits or less is always atomic. Operations on 64-bit fields are guaranteed to be atomic only in a 64-bit runtime environment, and statements that combine more than one read/write operation are never atomic:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Atomicity&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; _x&lt;span class="sh_symbol"&gt;,&lt;/span&gt; _y&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;long&lt;/span&gt; _z&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Test&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_type"&gt;long&lt;/span&gt; myLocal&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&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 class="sh_comment"&gt;// Atomic&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _z &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&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 class="sh_comment"&gt;// Nonatomic on 32-bit environs (_z is 64 bits)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myLocal &lt;span class="sh_symbol"&gt;=&lt;/span&gt; _z&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Nonatomic on 32-bit environs (_z is 64 bits)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _y &lt;span class="sh_symbol"&gt;+=&lt;/span&gt; _x&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Nonatomic (read AND write operation)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _x&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Nonatomic (read AND write operation)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Reading and writing 64-bit fields is nonatomic on 32-bit environments because it requires two separate instructions: one for each 32-bit memory location. So, if thread X reads a 64-bit value while thread Y is updating it, thread X may end up with a bitwise combination of the old and new values (a &lt;i&gt;torn read&lt;/i&gt;).&lt;br /&gt;The compiler implements unary operators of the kind &lt;code&gt;x++&lt;/code&gt; by reading a variable, processing it, and then writing it back. Consider the following class:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;ThreadUnsafe&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;int&lt;/span&gt; _x &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;1000&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Go&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt; &lt;span class="sh_keyword"&gt;for&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_type"&gt;int&lt;/span&gt; i &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i &lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt; i&lt;span class="sh_symbol"&gt;++)&lt;/span&gt; _x&lt;span class="sh_symbol"&gt;--;&lt;/span&gt; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;Putting aside the issue of memory barriers, you might expect that if 10 threads concurrently run &lt;code&gt;Go&lt;/code&gt;, &lt;code&gt;_x&lt;/code&gt; would end up as &lt;code&gt;0&lt;/code&gt;. However, this is not guaranteed, because a &lt;i&gt;race condition&lt;/i&gt; is possible whereby one thread preempts another in between retrieving &lt;code&gt;_x&lt;/code&gt;’s current value, decrementing it, and writing it back (resulting in an out-of-date value being written).&lt;br /&gt;Of course, you can address these issues by wrapping the nonatomic operations in a &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt;&lt;/code&gt; statement. Locking, in fact, &lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking_and_Atomicity"&gt;simulates atomicity if consistently applied&lt;/a&gt;. The &lt;code&gt;Interlocked&lt;/code&gt; class, however, provides an easier and faster solution for such simple operations:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;Program&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;long&lt;/span&gt; _sum&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Main&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// _sum&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Simple increment/decrement operations:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Increment&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// 1&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Decrement&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// 0&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Add/subtract a value:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Add&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;3&lt;/span&gt;&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// 3&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Read a 64-bit field:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Read&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 3&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Write a 64-bit field while reading previous value:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// (This prints "3" while updating _sum to 10)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Exchange&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;));&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 10&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Update a field only if it matches a certain value (10):&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Interlocked&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;CompareExchange&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;ref&lt;/span&gt; _sum&lt;span class="sh_symbol"&gt;,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_number"&gt;123&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// 123&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="note"&gt;All of &lt;code&gt;Interlocked&lt;/code&gt;’s methods generate a &lt;a href="http://www.albahari.com/threading/part4.aspx#_Full_fences"&gt;full fence&lt;/a&gt;. Therefore, fields that you access via &lt;code&gt;Interlocked&lt;/code&gt; don’t need additional fences — unless they’re accessed in other places in your program without &lt;code&gt;Interlocked&lt;/code&gt; or a &lt;code&gt;lock&lt;/code&gt;.&lt;/div&gt;&lt;code&gt;Interlocked&lt;/code&gt;’s mathematical operations are restricted to &lt;code&gt;Increment&lt;/code&gt;, &lt;code&gt;Decrement&lt;/code&gt;, and &lt;code&gt;Add&lt;/code&gt;. If you want to multiply — or perform any other calculation — you can do so in lock-free style by using the &lt;code&gt;CompareExchange&lt;/code&gt; method (typically in conjunction with spin-waiting). We give an example in &lt;a href="http://www.albahari.com/threading/part5.aspx#_SpinLock_and_SpinWait"&gt;the parallel programming section&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;Interlocked&lt;/code&gt; works by making its need for atomicity known to the operating system and virtual machine.&lt;br /&gt;&lt;div class="note"&gt;  &lt;code&gt;Interlocked&lt;/code&gt;’s methods have a typical overhead of 10 ns — half that of an uncontended &lt;code&gt;lock&lt;/code&gt;. Further, they can never suffer the additional cost of context switching due to &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking"&gt;blocking&lt;/a&gt;. The flip side is that using &lt;code&gt;Interlocked&lt;/code&gt; within a loop with many iterations can be less efficient than obtaining a single lock &lt;em&gt;around&lt;/em&gt; the loop (although &lt;code&gt;Interlocked&lt;/code&gt; enables greater &lt;em&gt;concurrency&lt;/em&gt;).&lt;/div&gt;&lt;h1&gt;  &lt;a href="" name="_Signaling_with_Wait_and_Pulse"&gt;Signaling with Wait and Pulse&lt;/a&gt; &lt;/h1&gt;&lt;div class="linqpad"&gt;&lt;br /&gt;&lt;/div&gt;Earlier we discussed &lt;a href="http://www.albahari.com/threading/part2.aspx#_Signaling_with_Event_Wait_Handles"&gt;Event Wait Handles&lt;/a&gt; — a simple signaling mechanism where a thread blocks until it receives notification from another.&lt;br /&gt;A more powerful signaling construct is provided by the &lt;code&gt;Monitor&lt;/code&gt; class, via the static methods &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; (and &lt;code&gt;PulseAll&lt;/code&gt;). The principle is that you write the signaling logic yourself using custom flags and fields (enclosed in &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt;&lt;/code&gt; statements), and then introduce &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; commands to prevent &lt;a href="http://www.albahari.com/threading/part2.aspx#_Blocking_Versus_Spinning"&gt;spinning&lt;/a&gt;. With just these methods and the &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Locking"&gt;lock&lt;/a&gt;&lt;/code&gt; statement, you can achieve the functionality of &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_AutoResetEvent"&gt;AutoResetEvent&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_ManualResetEvent"&gt;ManualResetEvent&lt;/a&gt;&lt;/code&gt;, and &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_Semaphore"&gt;Semaphore&lt;/a&gt;&lt;/code&gt;, as well as (with some caveats) &lt;code&gt;WaitHandle&lt;/code&gt;’s static methods &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_WaitAny_WaitAll_SignalAndWait"&gt;WaitAll&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href="http://www.albahari.com/threading/part2.aspx#_WaitAny_WaitAll_SignalAndWait"&gt;WaitAny&lt;/a&gt;&lt;/code&gt;. Furthermore, &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; can be amenable in situations where all of the wait handles are parsimoniously challenged.&lt;br /&gt;&lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; signaling, however, has some disadvantages over event wait handles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   &lt;code&gt;Wait&lt;/code&gt;/&lt;code&gt;Pulse&lt;/code&gt; cannot span application domains or processes on a computer.&lt;/li&gt;&lt;li&gt;You must remember to protect all variables related to the signaling logic with locks.&lt;/li&gt;&lt;li&gt;   &lt;code&gt;Wait&lt;/code&gt;/&lt;code&gt;Pulse&lt;/code&gt; programs may confuse developers relying on Microsoft’s documentation.&lt;/li&gt;&lt;/ul&gt;The documentation problem arises because it’s not obvious how &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; are supposed to be used, even when you’ve read up on how they work. &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt; also have a peculiar aversion to dabblers: they will seek out any holes in your understanding and then delight in tormenting you! Fortunately, there is a simple pattern of use that tames &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt;.&lt;br /&gt;In terms of performance, calling &lt;code&gt;Pulse&lt;/code&gt; takes around a hundred nanoseconds on a 2010-era desktop — about a third of the time it takes to call &lt;code&gt;Set&lt;/code&gt; on a wait handle. The overhead for waiting on uncontended signal is entirely up to you — because you implement the logic yourself using ordinary fields and variables. In practice, this is very simple and amounts purely to the cost of taking a &lt;code&gt;lock&lt;/code&gt;. &lt;br /&gt;&lt;h2&gt;  &lt;a href="" name="_How_to_Use_Wait_and_Pulse"&gt;How to Use Wait and Pulse&lt;/a&gt; &lt;/h2&gt;Here’s how to use &lt;code&gt;Wait&lt;/code&gt; and &lt;code&gt;Pulse&lt;/code&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;   Define a single field for use as the synchronization object, such as:&lt;br /&gt;&lt;pre&gt;readonly object _locker = new object();&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;   Define field(s) for use in your custom blocking condition(s). For example:&lt;br /&gt;&lt;pre&gt;bool _go; &lt;em&gt;or:&lt;/em&gt; int _semaphoreCount;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;   Whenever you want to block, include the following code:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt; &lt;i&gt;&lt;span style="color: purple; font-family: arial;"&gt;&lt;span class="sh_symbol"&gt;&amp;lt;&lt;/span&gt;blocking&lt;span class="sh_symbol"&gt;-&lt;/span&gt;condition&lt;span class="sh_symbol"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt; &lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;    Monitor&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;   Whenever you change (or potentially change) a blocking condition, include this code:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_comment"&gt;// Alter field(s) or data that might impact blocking condition(s)&lt;/span&gt;&lt;br /&gt;  &lt;span class="sh_comment"&gt;// ...&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;Monitor&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Pulse&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// or: &lt;/span&gt;&lt;b&gt;&lt;span class="sh_comment"&gt;Monitor.PulseAll (_locker)&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_comment"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;(If you change a blocking condition &lt;em&gt;and&lt;/em&gt; want to wait, you can incorporate steps 3 and 4 in a single &lt;code&gt;lock&lt;/code&gt;.)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;This pattern allows any thread to wait at any time for any condition. Here’s a simple example, where a worker thread waits until the &lt;code&gt;_go&lt;/code&gt; field is set to &lt;code&gt;true&lt;/code&gt;:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;class&lt;/span&gt;&lt;span class="sh_normal"&gt; &lt;/span&gt;&lt;span class="sh_classname"&gt;SimpleWaitPulse&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_keyword"&gt;readonly&lt;/span&gt; &lt;span class="sh_type"&gt;object&lt;/span&gt; _locker &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_type"&gt;object&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;bool&lt;/span&gt; _go&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Main&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// The new thread will block&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;new&lt;/span&gt; &lt;span class="sh_function"&gt;Thread&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;Work&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;Start&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// because _go==false.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;ReadLine&lt;/span&gt;&lt;span class="sh_symbol"&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; &lt;span class="sh_comment"&gt;// Wait for user to hit Enter&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Let's now wake up the thread by&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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 class="sh_comment"&gt;// setting _go=true and pulsing.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _go &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;b&gt;Monitor&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Pulse&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;static&lt;/span&gt; &lt;span class="sh_type"&gt;void&lt;/span&gt; &lt;span class="sh_function"&gt;Work&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;_go&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Monitor&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="sh_comment"&gt;// Lock is released while we’re waiting&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;WriteLine&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;"Woken!!!"&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre class="output"&gt;Woken!!!&amp;nbsp;&amp;nbsp; &lt;i&gt;(after pressing Enter)&lt;/i&gt;&lt;/pre&gt;For &lt;a href="http://www.albahari.com/threading/part2.aspx#_Thread_Safety"&gt;thread safety&lt;/a&gt;, we ensure that all shared fields are accessed within a lock. Hence, we add &lt;code&gt;lock&lt;/code&gt; statements around both reading and updating the &lt;code&gt;_go&lt;/code&gt; flag. This is essential (unless you’re willing to follow the &lt;a href="http://www.albahari.com/threading/part4.aspx#_Nonblocking_Synchronization"&gt;nonblocking synchronization&lt;/a&gt; principles).&lt;br /&gt;The &lt;code&gt;Work&lt;/code&gt; method is where we block, waiting for the &lt;code&gt;_go&lt;/code&gt; flag to become &lt;code&gt;true&lt;/code&gt;. The &lt;code&gt;Monitor.Wait&lt;/code&gt; method does the following, in order:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Releases the lock on &lt;code&gt;_locker&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Blocks until &lt;code&gt;_locker&lt;/code&gt; is “pulsed.”&lt;/li&gt;&lt;li&gt;Reacquires the lock on &lt;code&gt;_locker&lt;/code&gt;. If the lock is contended, then it blocks until the lock is available.&lt;/li&gt;&lt;/ol&gt;&lt;div class="note"&gt;  This means that despite appearances, &lt;em&gt;no&lt;/em&gt; lock is held on the synchronization object while &lt;code&gt;Monitor.Wait&lt;/code&gt; awaits a pulse:&lt;br /&gt;&lt;pre class="sh_csharp sh_sourceCode"&gt;&lt;span class="sh_keyword"&gt;lock&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(!&lt;/span&gt;_go&lt;span class="sh_symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;Wait&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;_locker&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// _lock is released&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_comment"&gt;// lock is regained&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span class="sh_symbol"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;Execution then continues at the next statement. &lt;code&gt;Monitor.Wait&lt;/code&gt; is designed for use within a &lt;code&gt;lock&lt;/code&gt; statement; it throws an exception if called otherwise. The same goes for &lt;code&gt;Monitor.Pulse&lt;/code&gt;.&lt;br /&gt;In the &lt;code&gt;Main&lt;/code&gt;
