<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lluís Franco on Geeks.ms : 4.0, Ejemplo</title><link>http://geeks.ms/blogs/lfranco/archive/tags/4.0/Ejemplo/default.aspx</link><description>Etiquetas: 4.0, Ejemplo</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[HowTo] Crear una pantalla que espere la conclusión de una tarea larga (con cancelación)</title><link>http://geeks.ms/blogs/lfranco/archive/2011/09/29/howto-crear-una-pantalla-que-espere-la-conclusi-243-n-de-una-tarea-larga-con-cancelaci-243-n.aspx</link><pubDate>Thu, 29 Sep 2011 09:52:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200835</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=200835</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2011/09/29/howto-crear-una-pantalla-que-espere-la-conclusi-243-n-de-una-tarea-larga-con-cancelaci-243-n.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreen_5F00_5E17F4EA.png"&gt;&lt;img height="352" width="451" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreen_5F00_thumb_5F00_7BA9CFE9.png" alt="WaitForTaskScreen" border="0" title="WaitForTaskScreen" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En el &lt;a href="http://geeks.ms/blogs/lfranco/archive/2011/09/28/howto-crear-una-pantalla-que-espere-la-conclusi-243-n-de-una-tarea-larga.aspx"&gt;post anterior&lt;/a&gt; vimos un ejemplo de c&amp;oacute;mo crear una ventana que espere la conclusi&amp;oacute;n de una tarea. Si bien este ejemplo cubr&amp;iacute;a sobradamente el objetivo, dejamos abierta la puerta a la posibilidad de que dicha tarea pudiese ser cancelada por petici&amp;oacute;n del usuario, pulsando el bot&amp;oacute;n &amp;lsquo;cancel&amp;rsquo; de la ventana.&lt;/p&gt;
&lt;p align="justify"&gt;Si se hizo de este modo fue para evitar complicar en exceso el post, ya que el objetivo inicial era simplemente &amp;ldquo;mostrar una ventana mientras durase el proceso&amp;rdquo;.&lt;/p&gt;
&lt;p align="justify"&gt;Tras publicar el post y ver algunas de las reacciones en el &lt;a href="http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/56fd68a6-2e9f-4639-a9a6-621b9f32c56d/?prof=required"&gt;hilo del foro de C#&lt;/a&gt; de MSDN (gracias &lt;a href="http://social.msdn.microsoft.com/profile/pedro%20hurtado/"&gt;Pedro&lt;/a&gt; por tu idea), he decidido ampliar el proyecto de ejemplo ofreciendo al usuario la posibilidad de cancelar REALMENTE la tarea, utilizando para ello un &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.aspx"&gt;CancellationToken&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.aspx"&gt;CancellationToken&lt;/a&gt; es una estructura nueva del .NET Framework 4.0 (as&amp;iacute; como toda la TPL en s&amp;iacute;), y permite la cancelaci&amp;oacute;n de un proceso as&amp;iacute;ncrono. Es com&amp;uacute;nmente usada cuando deseamos propagar una notificaci&amp;oacute;n de cancelaci&amp;oacute;n hacia arriba, por ejemplo, hacia el m&amp;eacute;todo que est&amp;aacute; siendo ejecutado como en nuestro caso.&lt;/p&gt;
&lt;p align="justify"&gt;Para ello necesitamos crear previamente un &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.aspx"&gt;CancellationTokenSource&lt;/a&gt;, que es el objeto que contiene el token de cancelaci&amp;oacute;n y que adem&amp;aacute;s nos va a permitir cancelar la tarea. Posteriormente este objeto nos proporcionar&amp;aacute; el token de cancelaci&amp;oacute;n, que usaremos en la llamada a la tarea. Pero vamos a verlo mejor con un poco de c&amp;oacute;digo:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;En el formulario de espera:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Aparecen algunos cambios, por ejemplo debemos modificar la firma de la propiedad ActionToExecute para que acepte un m&amp;eacute;todo que contenga un par&amp;aacute;metro de tipo CancellationToken. Este par&amp;aacute;metro ser&amp;aacute; usado por el m&amp;eacute;todo para saber si se ha cancelado y actuar en consecuencia. De paso aprovecharemos para declarar el &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.aspx"&gt;CancellationTokenSource&lt;/a&gt;.&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Action&amp;lt;CancellationToken&amp;gt; ActionToExecute { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;CancellationTokenSource cancelTokenSource = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CancellationTokenSource();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Nota importante: En el proyecto anterior, el bot&amp;oacute;n &amp;lsquo;cancel&amp;rsquo; no ten&amp;iacute;a c&amp;oacute;digo asociado. Simplemente ten&amp;iacute;a establecida la propiedad DialogResult en Cancel, de modo que al pulsarlo cerraba autom&amp;aacute;ticamente la ventana y devolv&amp;iacute;a el valor Cancel a su llamador. En el proyecto actual como s&amp;iacute; que nos interesa controlar el cierre de la ventana, es necesario establecer la propiedad DialogResult en None e interceptar su evento:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;closeButton.Click += closeButton_Click;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; closeButton_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Aqu&amp;iacute; m&amp;aacute;s adelante cancelaremos la tarea y devolveremos un valor DialogResult = Cancel.&lt;/p&gt;
&lt;p align="justify"&gt;Ahora vamos a centrarnos en la creaci&amp;oacute;n y ejecuci&amp;oacute;n de la tarea as&amp;iacute;ncrona:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; fSplashScreen_Shown(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    titleLabel.Text = Title;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    messageLabel.Text = Message;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    pictureBox.Image = Picture;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Task.Factory.StartNew(() =&amp;gt; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        ActionToExecute(cancelTokenSource.Token)).ContinueWith((t) =&amp;gt; taskCompleted());&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Como veis en realidad no hay demasiados cambios, lo &amp;uacute;nico es que en la llamada a StartNew obtenemos el token de cancelaci&amp;oacute;n de su &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.aspx"&gt;CancellationTokenSource&lt;/a&gt;, y cuando posteriormente &amp;eacute;sta sea cancelada por el usuario, el token ser&amp;aacute; propagado hasta el m&amp;eacute;todo que se est&amp;aacute; ejecutando, permitiendo su cancelaci&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Hablando del m&amp;eacute;todo, que modificaciones hay que realizar?&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;El m&amp;eacute;todo original era este:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoSomeHardWork()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 50; i++)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Console.WriteLine(i);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Thread.Sleep(100);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }            &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Y el nuevo quedar&amp;iacute;a as&amp;iacute;:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoSomeHardWorkWithCancellation(CancellationToken cancelToken)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 50; i++)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            cancelToken.ThrowIfCancellationRequested();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Console.WriteLine(i);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Thread.Sleep(100);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        MessageBox.Show(ex.Message, Application.ProductName, &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Como dec&amp;iacute;amos antes, este m&amp;eacute;todo recibe un par&amp;aacute;metro de tipo CancellationToken y lo &amp;uacute;nico que hay que hacer es lanzar una excepci&amp;oacute;n en caso que haya sigo solicitada una cancelaci&amp;oacute;n (de ah&amp;iacute; que se envuelva el c&amp;oacute;digo dentro de un bloque try-catch).&lt;/p&gt;
&lt;p align="justify"&gt;Nada m&amp;aacute;s. Una s&amp;oacute;lo l&amp;iacute;nea y el pertinente bloque de intercepci&amp;oacute;n de errores&amp;hellip; y voil&amp;aacute;! No os parece bonito y elegante? :-)&lt;/p&gt;
&lt;p align="justify"&gt;Por cierto, en caso que no se desee lanzar una excepci&amp;oacute;n es posible que os interese preguntar por el valor de la propiedad &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.iscancellationrequested.aspx"&gt;IsCancellationRequested&lt;/a&gt; y elegir vosotros mismos la acci&amp;oacute;n m&amp;aacute;s apropiada.&lt;/p&gt;
&lt;p align="justify"&gt;Volvamos al formulario de espera y completemos el c&amp;oacute;digo que falta. Primeramente el c&amp;oacute;digo del bot&amp;oacute;n &amp;lsquo;cancel&amp;rsquo;, encargado de cancelar realmente la tarea:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; closeButton_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    DialogResult = DialogResult.Cancel;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    cancelTokenSource.Cancel();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    releaseCancellationTokenSource();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; releaseCancellationTokenSource()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (cancelTokenSource != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        cancelTokenSource.Dispose();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        cancelTokenSource = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Y por &amp;uacute;ltimo, agregar una l&amp;iacute;nea para liberar tambi&amp;eacute;n el token al finalizar con &amp;eacute;xito la tarea:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; taskCompleted()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (InvokeRequired)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Invoke((MethodInvoker)(() =&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Close();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            DialogResult = DialogResult.OK;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    releaseCancellationTokenSource();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Y con esto y un bizcocho, hemos terminado! Espero que os haya gustado :-D&lt;/p&gt;
&lt;p align="justify"&gt;Muchas gracias de nuevo a Pedro Hurtado y a toda la gente del &lt;a href="http://social.msdn.microsoft.com/Forums/es-ES/vcses/threads"&gt;foro de C# en MSDN&lt;/a&gt; :-)&lt;/p&gt;
&lt;p&gt;Os dejo tambi&amp;eacute;n el mini proyecto de ejemplo por si quer&amp;eacute;is jugar un rato:&lt;/p&gt;
&lt;p&gt;&lt;iframe scrolling="no" marginwidth="0" frameborder="0" src="https://skydrive.live.com/embedicon.aspx/MSDN%20Samples/TestWaitForTaskScreenWithCancellation.zip?cid=f3a970280830b5fe&amp;amp;sc=documents" marginheight="0" title="Preview" style="background-color:#fcfcfc;width:98px;height:115px;padding:0px;"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Nos vemos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200835" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Ejemplo/default.aspx">Ejemplo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/4.0/default.aspx">4.0</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/MSDN+Forums/default.aspx">MSDN Forums</category></item><item><title>[HowTo] Crear una pantalla que espere la conclusión de una tarea larga</title><link>http://geeks.ms/blogs/lfranco/archive/2011/09/28/howto-crear-una-pantalla-que-espere-la-conclusi-243-n-de-una-tarea-larga.aspx</link><pubDate>Wed, 28 Sep 2011 13:49:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200795</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=200795</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2011/09/28/howto-crear-una-pantalla-que-espere-la-conclusi-243-n-de-una-tarea-larga.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreen_5F00_07568375.png"&gt;&lt;img height="352" width="451" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreen_5F00_thumb_5F00_72F0BDE9.png" alt="WaitForTaskScreen" border="0" title="WaitForTaskScreen" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Otro post en respuesta a una pregunta bastante habitual en los foros MSDN: &amp;ldquo;Mi frmPrincipal ejecuta una funci&amp;oacute;n (no tengo el tiempo preciso) y mientras realiza esto quiero que aparezca una ventana &amp;hellip; que impida el acceso al frmPrincipal y una vez que se termine de ejecutar la funci&amp;oacute;n, desaparezca frmMensaje.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align="justify"&gt;La verdad es que hay un mont&amp;oacute;n de posibles soluciones. Desde el uso del componente &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx"&gt;BackgroundWorker&lt;/a&gt; (la opci&amp;oacute;n m&amp;aacute;s sencilla pero la que menos me gusta :-P) hasta los futuros &lt;strong&gt;async&lt;/strong&gt; y &lt;strong&gt;await&lt;/strong&gt; que &lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2010/10/28/asynchrony-in-c-5-part-one.aspx"&gt;vendr&amp;aacute;n con C# 5&lt;/a&gt;, pasando por los cl&amp;aacute;sicos threads de toda la vida o las tareas que se introdujeron con la TPL en Visual Studio 2010.&lt;/p&gt;
&lt;p align="justify"&gt;Para este ejemplo vamos a utilizar &amp;eacute;sta &amp;uacute;ltima aproximaci&amp;oacute;n, ya que de las otras hay millones de ejemplos de todos los tipos y colores. Adem&amp;aacute;s, puede servir como -sencillo- ejercicio de uso de la clase &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx"&gt;Task&lt;/a&gt;, para que qui&amp;eacute;n no la conozca vaya introduci&amp;eacute;ndose en el &lt;a href="http://youtu.be/2axRAjrXDME?hd=1"&gt;maravilloso mundo de la programaci&amp;oacute;n paralela&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Primeramente vamos a crear un formulario con un t&amp;iacute;tulo, un mensaje y una barra de progreso de tipo marquesina, ya que como dice el enunciado &amp;ldquo;no se conoce de antemano la duraci&amp;oacute;n de la tarea a ejecutar&amp;rdquo;. Y para comprobar que la tarea se ejecuta en segundo plano (en realidad en paralelo si hay m&amp;aacute;s de un core en el procesador) tambi&amp;eacute;n a&amp;ntilde;adiremos un bot&amp;oacute;n para poder cerrar la ventana.&lt;/p&gt;
&lt;p align="justify"&gt;Aviso: Este bot&amp;oacute;n &amp;uacute;nicamente sirve para cerrar la ventana y retornar a la ventana principal.&amp;nbsp; R&lt;strong&gt;ealmente no va a cancelar la tarea&lt;/strong&gt;, para eso se requerir&amp;iacute;a un &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.aspx"&gt;CancellationToken&lt;/a&gt;, y no quiero complicar tanto el ejemplo... Aunque tal vez sea buena idea verlo en otro post, m&amp;aacute;s adelante.&lt;/p&gt;
&lt;p align="justify"&gt;El punto de partida ser&amp;aacute; la ventana principal. En mi caso y para no complicarme la vida he creado un formulario muy sencillo con un s&amp;oacute;lo bot&amp;oacute;n, y que contiene un m&amp;eacute;todo que se supone que va a tardar un cierto tiempo en ejecutarse. Iba a poner &amp;lsquo;un huevo&amp;rsquo; pero prefiero no hacerlo para no herir susceptibilidades :-)&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;El formulario principal:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/MainForm_5F00_38291513.png"&gt;&lt;img height="267" width="366" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/MainForm_5F00_thumb_5F00_6F8F2641.png" alt="MainForm" border="0" title="MainForm" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;El m&amp;eacute;todo que tarda&amp;hellip; mucho:&lt;/strong&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoSomeHardWork()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 50; i++)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Console.WriteLine(i);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Thread.Sleep(100);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }            &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;strong&gt;El formulario que espera a que la tarea termine:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreenDesign_5F00_3BE6B9E3.png"&gt;&lt;img height="352" width="451" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreenDesign_5F00_thumb_5F00_0601C4C9.png" alt="WaitForTaskScreenDesign" border="0" title="WaitForTaskScreenDesign" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Una vez dise&amp;ntilde;ada el formulario de espera, le agregaremos algunas propiedades como el t&amp;iacute;tulo, mensaje, y sobre todo el m&amp;eacute;todo que deseamos ejecutar en forma de &lt;a href="http://msdn.microsoft.com/en-us/library/018hxwa8.aspx"&gt;Action&lt;/a&gt;:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Title { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Message { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Image Picture { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Action ActionToExecute { get; set; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Una vez creadas estas propiedades, podemos volver al formulario principal y hacer la llamada a la ventana de espera, pas&amp;aacute;ndole los valores oportunos:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (fWaitForTaskScreen fwait = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; fWaitForTaskScreen())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        fwait.Title = &lt;span style="color:#006080;"&gt;&amp;quot;Executing a looooong task...&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        fwait.Message = &lt;span style="color:#006080;"&gt;&amp;quot;This form will close when the task completes its work.\nJust wait a few seconds... :-)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        fwait.Picture = Properties.Resources.LogoWeb30_small;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        fwait.ActionToExecute = DoSomeHardWork;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (fwait.ShowDialog() == DialogResult.OK)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Cancel or error&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }   &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Lo &amp;uacute;nico importante aqu&amp;iacute; es la forma en que le pasamos el m&amp;eacute;todo que debe ejecutar.&amp;nbsp; Estamos usando una propiedad de tipo &lt;a href="http://msdn.microsoft.com/en-us/library/018hxwa8.aspx"&gt;Action&lt;/a&gt;, que representa un m&amp;eacute;todo con un par&amp;aacute;metro que no retorna un valor. De modo, que -ya os aviso- sirve para ejecutar cualquier m&amp;eacute;todo que no devuelva un valor. En caso que queramos devolver un valor podr&amp;iacute;amos utilizar una propiedad p&amp;uacute;blica, o mejor un &lt;a href="http://msdn.microsoft.com/en-us/library/bb549151.aspx"&gt;delegado Func&amp;lt;T, TResult&amp;gt;&lt;/a&gt;. Pero como os dec&amp;iacute;a antes, prefiero no complicar el ejemplo.&lt;/p&gt;
&lt;p align="justify"&gt;El c&amp;oacute;digo es muy sencillo, como pod&amp;eacute;is ver. Crea el formulario de espera, le pasa los valores (incluyendo el m&amp;eacute;todo a ejecutar) y examinamos el valor de DialogResult para saber si ha terminado con &amp;eacute;xito la tarea o no, o se ha cancelado por el usuario.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Y a todo esto &amp;iquest;c&amp;oacute;mo se ejecuta el m&amp;eacute;todo de forma as&amp;iacute;ncrona?&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Pues aqu&amp;iacute; est&amp;aacute; la gracia de este ejercicio. Ya ver&amp;eacute;is lo sencillo que resulta, sobre todo para aquellos acostumbrados a trabajar &amp;lsquo;a pelo&amp;rsquo; con threads:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; fSplashScreen_Shown(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    titleLabel.Text = Title;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    messageLabel.Text = Message;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    pictureBox.Image = Picture;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Task.Factory.StartNew(ActionToExecute).ContinueWith((t) =&amp;gt; taskCompleted());&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; taskCompleted()&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (InvokeRequired)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Invoke((MethodInvoker)(() =&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Close();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            DialogResult = DialogResult.OK;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Vayamos por partes. El primer bloque es realmente la parte importante. De hecho, la &amp;uacute;ltima l&amp;iacute;nea es la que se encarga de todo. Crea y ejecuta una tarea as&amp;iacute;ncrona que apunte al m&amp;eacute;todo que le hemos pasado al formulario, y no s&amp;oacute;lo hace eso, si no que adem&amp;aacute;s le decimos que cuando termine ejecute una segunda tarea &amp;lsquo;taskCoompleted&amp;rsquo;. A esto se le llama &lt;a href="http://msdn.microsoft.com/en-us/library/dd537612.aspx"&gt;&amp;lsquo;encadenamiento&amp;rsquo; de tareas,&lt;/a&gt; y es muy &amp;uacute;til cuando una tarea depende de otra.&lt;/p&gt;
&lt;p align="justify"&gt;Y que hace la segunda tarea? Apenas nada. Cierra el formulario y devuelve el valor OK para que la ventana principal sepa que todo ha terminado bien. Lo &amp;uacute;nico que sucede es que -al igual que cuando usamos threads- en .NET no se puede modificar un control fuera del thread que lo ha creado, eso es, el thread principal.&amp;nbsp; Y nuestras tareas se est&amp;aacute;n ejecutando en otros threads creados de forma transparente por la tarea. De modo que para poder llamar al m&amp;eacute;todo Close o modificar la propiedad DialogResult debemos hacerlo mediante &lt;a href="http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx"&gt;Control.Invoke&lt;/a&gt;, y por ese motivo el c&amp;oacute;digo es un poco extra&amp;ntilde;o a primera vista.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreenFinal_5F00_59E4C7D7.png"&gt;&lt;img height="569" width="732" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/WaitForTaskScreenFinal_5F00_thumb_5F00_5E4B22D1.png" alt="WaitForTaskScreenFinal" border="0" title="WaitForTaskScreenFinal" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Os dejo el mini proyecto de ejemplo por si quer&amp;eacute;is jugar un rato:&lt;/p&gt;
&lt;p&gt;&lt;iframe scrolling="no" marginwidth="0" frameborder="0" src="https://skydrive.live.com/embedicon.aspx/MSDN%20Samples/TestWaitForTaskScreen.zip?cid=f3a970280830b5fe&amp;amp;sc=documents" marginheight="0" title="Preview" style="background-color:#fcfcfc;width:98px;height:115px;padding:0px;"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Nos vemos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200795" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Ejemplo/default.aspx">Ejemplo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/4.0/default.aspx">4.0</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/MSDN+Forums/default.aspx">MSDN Forums</category></item><item><title>Materiales de la charla sobre computación paralela en BcnDev</title><link>http://geeks.ms/blogs/lfranco/archive/2010/11/22/materiales-de-la-charla-sobre-computaci-243-n-paralela-en-bcndev.aspx</link><pubDate>Mon, 22 Nov 2010 09:30:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185109</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=185109</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2010/11/22/materiales-de-la-charla-sobre-computaci-243-n-paralela-en-bcndev.aspx#comments</comments><description>&lt;p&gt;Hola de nuevo,&lt;/p&gt;  &lt;p&gt;Después de la charla del viernes en BCNDEV, lo prometido es deuda. Os comenté que había realizado las demos en forma de un pequeño proyecto web, para no tener que ir con un pedazo-de-pepino a hacer las demos (más que nada porque no lo tengo :-P). Así que sólo quiero dejaros el enlace al proyecto que usé para las demos de la TPL, por si alguno las quiere probar:&lt;/p&gt;  &lt;p&gt;&lt;iframe style="padding-bottom:0px;background-color:#fcfcfc;padding-left:0px;width:98px;padding-right:0px;height:115px;padding-top:0px;" title="Preview" marginheight="0" src="http://cid-f3a970280830b5fe.office.live.com/embedicon.aspx/AndorraDotNet/Events/DemoParallelWeb.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;Os recuerdo que si el proyecto lo probáis en una máquina virtual poco paralelismo vais a ver, pero publicarlo en el host o en cualquier estación con varios cores y veréis la diferencia de rendimiento. En algunos casos no hay mucha ganancia, pero en algunos otros la diferencia es de 5 a 1 o más.&lt;/p&gt;  &lt;p&gt;Aprovecho para dejaros la versión más reciente de la presentación, y os prometo que no la voy a actualizar más :-) que bastante lo he hecho en los ú días:&lt;/p&gt;  &lt;div style="width:425px;" id="__ss_5858149"&gt;&lt;strong style="margin:12px 0px 4px;display:block;"&gt;&lt;a title="News40 Parallel Computing" href="http://www.slideshare.net/lluisfranco/news40-parallel-computing-5858149"&gt;News40 Parallel Computing&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5858149" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=news40parallelcomputing-12904179230539-phpapp02&amp;amp;stripped_title=news40-parallel-computing-5858149&amp;amp;userName=lluisfranco" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse5858149" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=news40parallelcomputing-12904179230539-phpapp02&amp;amp;stripped_title=news40-parallel-computing-5858149&amp;amp;userName=lluisfranco" type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom:12px;padding-left:0px;padding-right:0px;padding-top:5px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/lluisfranco"&gt;AndorraDotNet&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Saludos a todos,&lt;/p&gt; &lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185109" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Event/default.aspx">Event</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Ejemplo/default.aspx">Ejemplo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx">2010</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/4.0/default.aspx">4.0</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Presentaci_26002300_243_3B00_n/default.aspx">Presentaci&amp;#243;n</category></item></channel></rss>