{"id":630,"date":"2017-09-04T07:17:38","date_gmt":"2017-09-04T07:17:38","guid":{"rendered":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=630"},"modified":"2017-09-04T07:18:17","modified_gmt":"2017-09-04T07:18:17","slug":"asincronia-en-c-bloqueos-contextos-y-tareas","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/","title":{"rendered":"Asincron\u00eda en C#: Bloqueos, contextos y tareas."},"content":{"rendered":"<h2><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-690\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Asincron\u00eda-en-Tasks.-Bloqueos-contextos-y-tareas..png\" alt=\"Asincron\u00eda en Tasks. Bloqueos, contextos y tareas.\" width=\"603\" height=\"659\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Asincron\u00eda-en-Tasks.-Bloqueos-contextos-y-tareas..png 603w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Asincron\u00eda-en-Tasks.-Bloqueos-contextos-y-tareas.-275x300.png 275w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/h2>\n<p>\u201c\u00a1Rec\u00f3rcholis! \u00a1Mi fant\u00e1stico m\u00e9todo <em>HagoCosasChulasAsync<\/em> bloquea mi aplicaci\u00f3n!\u201d.<\/p>\n<p>Si has utilizado la <strong>Asincron\u00eda basada en <em>Tasks<\/em><\/strong> (<a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/standard\/asynchronous-programming-patterns\/task-based-asynchronous-pattern-tap\">TAP<\/a>) en aplicaciones algo complejas, esta frase te sonar\u00e1. Posiblemente, despu\u00e9s de entrar en p\u00e1nico y ojear <em>Stack Overflow<\/em> hayas dado con la panacea a todos tus problemas: el m\u00e9todo <em>ConfigureAwait<\/em> que nos expone la clase <em>Task<\/em>. Pas\u00e1ndole a este m\u00e9todo \u00abfalse\u00bb como par\u00e1metro y a\u00f1adi\u00e9ndolo a lo largo de todas las <em>Tasks<\/em>, todo vuelve a funcionar como esperabas.<\/p>\n<p><!--more--><\/p>\n<p>Aunque esto solucione nuestros bloqueos, no est\u00e1 de m\u00e1s saber por qu\u00e9 suceden. Tambi\u00e9n es importante el porqu\u00e9 la soluci\u00f3n pasa por a\u00f1adir este m\u00e9todo a nuestras llamadas as\u00edncronas. En este post vamos a intentar <strong>aclarar algunos de los conceptos claves del TAP<\/strong> para ahorrar dolores de cabeza (y canas) a los desarrolladores que tienen la fortuna de usarlo en sus aplicaciones.<\/p>\n<h2>Qu\u00e9 es una Task<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-653\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/At\u2013Planning_One-time_Tasks-300x265.jpg\" alt=\"\" width=\"300\" height=\"265\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/At\u2013Planning_One-time_Tasks-300x265.jpg 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/At\u2013Planning_One-time_Tasks.jpg 525w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><br \/>\nPara comenzar a entender realmente qu\u00e9 hay debajo de nuestro fant\u00e1stico c\u00f3digo as\u00edncrono, debemos familiarizarnos con las <strong><em>Tasks<\/em><\/strong>. Seg\u00fan la documentaci\u00f3n, una <em>Task<\/em> representa una <strong>operaci\u00f3n as\u00edncrona<\/strong>. En nuestro contexto, pr\u00e1cticamente es todo lo que necesitamos saber. Es una promesa de que algo se va a ejecutar y, si utilizamos <em>Task&lt;T&gt;<\/em>, \u00a0supone que se va a devolver un resultado tipo T. Podemos comprobar el estado de estas tareas mediante la propiedad <em>Status<\/em> o tambi\u00e9n las propiedades <em>IsCompleted<\/em>, <em>IsFaulted<\/em> o <em>IsCanceled<\/em>.<\/p>\n<p>Cuando creamos una <em>Task<\/em> de cualquier forma que no sea mediante constructor, tambi\u00e9n la iniciamos, es decir, empezar\u00e1 a ejecutarse en segundo plano autom\u00e1ticamente y el flujo de ejecuci\u00f3n del programa no se bloquear\u00e1.<\/p>\n<p>Para esperar a que esta tarea finalice y recuperar su resultado (si lo tiene), debemos utilizar la palabra clave <em>await<\/em>. Nunca usaremos el m\u00e9todo <em>Wait<\/em> ni accederemos al resultado mediante <em>Result<\/em>, ya que esto es una causa com\u00fan de bloqueos.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ Creamos una tarea\r\nTask&lt;int&gt; myTask = Task.FromResult(1000);\r\n\r\n\/\/ Podemos consultar el estado\r\n\/\/ Los posibles valores est\u00e1n definidos en el enum TaskStatus\r\nvar taskStatus = myTask.Status;\r\n\r\n\/\/ Existen propiedades booleanas para controlar los estados\r\nvar isTaskFaulted = myTask.IsFaulted;\r\nvar isTaskCanceled = myTask.IsCanceled;\r\nvar isTaskCompleted = myTask.IsCompleted;\r\n\r\n\/\/ Esperaremos a que terminen las tareas usando await\r\nvar awaitedResult = await myTask;\r\n\r\n\/\/ Nunca en c\u00f3digo as\u00edncrono lo haremos de esta forma\r\nmyTask.Wait();\r\nvar result = myTask.Result;\r\n<\/pre>\n<h2>\u00bfQu\u00e9 ocurre cuando uso Async y Await?<\/h2>\n<p>Por un lado, tenemos la palabra clave<em> async<\/em>, que a\u00f1adimos a la definici\u00f3n de nuestro m\u00e9todo y que lo marcar\u00e1 como as\u00edncrono. Esto nos permite utilizar la instrucci\u00f3n <em>await<\/em> en su c\u00f3digo. Ni optimiza nada, ni hace magia con el compilador. Simplemente informa que <em>await<\/em> puede o no aparecer en el c\u00f3digo contenido en el m\u00e9todo.<\/p>\n<p>Por otra parte, aparece la fant\u00e1stica <em>await<\/em>. Aqu\u00ed ya hay un poco m\u00e1s de miga. El uso de esta palabra clave delante de una llamada as\u00edncrona que devuelve un Awaitable (una operaci\u00f3n as\u00edncrona, que normalmente ser\u00e1 una <em>Task<\/em>), detiene la ejecuci\u00f3n del m\u00e9todo as\u00edncrono actual y hace un <em>return<\/em> del m\u00e9todo.<\/p>\n<p>Este m\u00e9todo se parar\u00e1 hasta que nuestro <em>Awaitable<\/em> finalice y s\u00f3lo entonces retomar\u00e1 su ejecuci\u00f3n. Para poder continuar, recapturar\u00e1 el contexto en el que se ejecutaba el m\u00e9todo antes de dicha parada.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ La palabra clave async nos permite usar await\r\n\/\/ Si la quitamos, el c\u00f3digo no compilar\u00e1\r\npublic async Task&lt;string&gt; HolaAsync()\r\n{\r\n    \/\/ Await devuelve el control a la aplicaci\u00f3n\r\n    \/\/ hasta que se complete la tarea\r\n    var saludo = await SaludarAsync(&quot;Hola&quot;);\r\n\r\n    \/\/ Aqu\u00ed volvemos a estar en el contexto previo\r\n    \/\/ a la llamada a SaludarAsync\r\n    return saludo;\r\n}\r\n\r\n\/\/ Solo podemos lanzar la tarea al no marcar\r\n\/\/ el m\u00e9todo como as\u00edncrono\r\npublic Task&lt;string&gt; SaludarAsync(string saludo)\r\n{\r\n    \/\/ Task.Run encola una nueva tarea a partir del delegado\r\n    return Task.Run(() =&gt; { return saludo; });\r\n}\r\n<\/pre>\n<h2>La magia del SynchronizationContext<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-656\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-300x298.png\" alt=\"Cadena de montaje\" width=\"300\" height=\"298\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-300x298.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-150x150.png 150w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-768x763.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1.png 801w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Hemos comentado que al retomar la ejecuci\u00f3n de un m\u00e9todo as\u00edncrono recapturamos el contexto en el que se ejecutaba. Pero, \u00bf<strong>qu\u00e9 es un<\/strong> <strong>contexto de sincronizaci\u00f3n<\/strong>?<\/p>\n<p>De forma muy resumida no es m\u00e1s que una especie de mensajero que permite a hilos de ejecuci\u00f3n comunicarse entre si. Cada parte del framework puede necesitar que este contexto se comporte de forma diferente, as\u00ed que se nos proporcionan varias implementaciones de este contexto. Por ejemplo, tenemos <em>AspNetSynchronizationContext<\/em>, que es propio de AspNet o <em>DispatcherSynchronizationContext<\/em>, que es el que se utiliza en aplicaciones WPF o Silverlight.<\/p>\n<p>Para m\u00e1s informaci\u00f3n sobre esto, podemos acudir a <a href=\"https:\/\/msdn.microsoft.com\/en-us\/magazine\/gg598924.aspx\">este fant\u00e1stico art\u00edculo<\/a> de Stephen Cleary.<\/p>\n<p>Os preguntar\u00e9is por qu\u00e9 nos importa esto. Pues bien, volvamos al principio. Hemos comentado que una de las maneras m\u00e1s efectivas para evitar bloqueos en nuestro c\u00f3digo as\u00edncrono es utilizar el m\u00e9todo <em>ConfigureAwait<\/em> cuando esperemos el resultado de una <em>Task<\/em>, pas\u00e1ndole <em>false<\/em> como par\u00e1metro. Esto provoca que el <em>awaiter<\/em> no capture el contexto de sincronizaci\u00f3n. No debemos olvidar que,<strong> al no capturar el contexto, no podremos acceder a \u00e9l en el c\u00f3digo que haya despu\u00e9s de la llamada a <em>ConfigureAwait<\/em>.<\/strong> Esto es importante, por ejemplo, en aplicaciones de escritorio o al trabajar con Request en AspNet.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic async Task&lt;string&gt; HolaAsync()\r\n{\r\n    \/\/ Obtendr\u00edamos el usuario sin problema\r\n    var userName = HttpContext.Current.User.Identity.Name;\r\n\r\n    \/\/ Hacemos la llamada con ConfigureAwait en false\r\n    var saludo = await SaludarAsync($&quot;Hola {userName}&quot;)\r\n        .ConfigureAwait(false);\r\n\r\n    \/\/ El c\u00f3digo fallar\u00e1 al llegar a esta linea.\r\n    \/\/ Hemos especificado que no quer\u00edamos capturar el contexto\r\n    \/\/ y al volver a entrar, este contexto Http no existe\r\n    var isUserAdmin = HttpContext.Current.User.IsInRole(&quot;Admin&quot;);\r\n    \r\n    return isUserAdmin ? saludo.ToUpper() : saludo;\r\n}\r\n<\/pre>\n<h2>Evitando los bloqueos<\/h2>\n<p>Aunque usar <em>ConfigureAwait<\/em> arregle nuestros problemas de forma casi m\u00e1gica la mayor\u00eda de veces, no es la mejor pr\u00e1ctica para evitar los bloqueos.<\/p>\n<p>\u00bfQu\u00e9 debemos hacer entonces? Pues para evitar los bloqueos, lo mejor es <strong>no bloquear<\/strong>. Aunque parezca una tonter\u00eda, realmente la manera m\u00e1s f\u00e1cil de evitarnos problemas es hacer que nuestro c\u00f3digo sea completamente as\u00edncrono. Veamos un ejemplo:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ Capa inferior\r\npublic class GreetingService\r\n{\r\n    private readonly IGreetingRepository greetingRepository;\r\n\r\n    public async Task&lt;string&gt; ObtenerSaludo(string userName)\r\n    {\r\n        \/\/ Devolvemos el control\r\n        return await greetingRepository.GetByUserAsync(userName);\r\n    }\r\n}\r\n\r\n\/\/ Controlador random WebAPI\r\npublic class GreetingController : ApiController\r\n{\r\n    public string Get()\r\n    {\r\n        var saludo = ObtenerSaludo(HttpContext.Current.User.Identity.Name);\r\n        \/\/ Esta llamada bloquear\u00e1 la aplicaci\u00f3n\r\n        return saludo.Result;\r\n    }\r\n}\r\n<\/pre>\n<p>\u00bfPor qu\u00e9 bloquearemos al esperar a que termine \u00absaludo\u00bb de forma s\u00edncrona?<\/p>\n<p>Pues bien, en el momento en el que llamamos a <em>GetByUserAsync<\/em> devolvemos el control a la aplicaci\u00f3n y, como no hemos indicado mediante <em>ConfigureAwait(false)<\/em> que no queremos ejecutar la continuaci\u00f3n de <em>ObtenerSaludo<\/em> en el mismo contexto, se quedar\u00e1 esperando a que \u00e9ste se libere. Esa continuaci\u00f3n nunca se producir\u00e1, ya que estamos <strong>bloqueando s\u00edncronamente<\/strong> en el m\u00e9todo <em>Get<\/em> y el contexto es el mismo.<\/p>\n<p>Podemos solucionar este error de dos formas: <strong>usando <em>ConfigureAwait(false)<\/em><\/strong> y diciendo as\u00ed que no queremos resumir la ejecuci\u00f3n de <em>ObtenerSaludo<\/em> en el mismo contexto, o bien<strong> haciendo el c\u00f3digo completamente s\u00edncrono<\/strong>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ Nuevo m\u00e9todo Get\r\npublic async Task&lt;string&gt; Get()\r\n{\r\n    \/\/ No necesitamos ConfigureAwait(false)\r\n    return await ObtenerSaludo(HttpContext.Current.User.Identity.Name);\r\n}\r\n<\/pre>\n<p>Hay que tener en cuenta las implicaciones de elegir la soluci\u00f3n de a\u00f1adir <em>ConfigureAwait(false)<\/em>.<\/p>\n<p>Si estamos bloqueando en el m\u00e9todo que est\u00e1 mas arriba hay que a\u00f1adirlo a absolutamente todas las <em>Task<\/em> a lo largo del c\u00f3digo afectado. Y con todo, me refiero a nuestro c\u00f3digo y al de librer\u00edas de terceros, sobre las que no siempre solemos tener el control. En el caso de que seamos nosotros los que escribamos una API o una librer\u00eda de cualquier tipo, es correcto usar <em>ConfigureAwait(false)<\/em>, ya que no podemos controlar si el que nos llama bloquea o no. Por lo tanto, lo mejor es curarse en salud.<\/p>\n<h2>En Resumen<\/h2>\n<p>Es importante <strong>no conformarnos con aplicar las soluciones de <\/strong><em><strong>Stack Overflow<\/strong>. A<\/em>unque nos faciliten la vida y nos eviten caer en el alcoholismo \ud83d\ude09 \u00a0En mi opini\u00f3n es muy importante saber por qu\u00e9 suceden los fallos y por qu\u00e9 la soluci\u00f3n es la que se propone. En nuestro caso, aunque <em>ConfigureAwait<\/em> nos arregla la mayor\u00eda de problemas con bloqueos, no es la mejor de las pr\u00e1cticas. Y si no seguimos las buenas pr\u00e1cticas no podemos presumir de ello \ud83d\ude42<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>\u201c\u00a1Rec\u00f3rcholis! \u00a1Mi fant\u00e1stico m\u00e9todo HagoCosasChulasAsync bloquea mi aplicaci\u00f3n!\u201d. Si has utilizado la Asincron\u00eda basada en Tasks (TAP) en aplicaciones algo complejas, esta frase te sonar\u00e1. Posiblemente, despu\u00e9s de entrar en p\u00e1nico y ojear Stack Overflow hayas dado con la panacea &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":126,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-630","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Asincron\u00eda basada en Tasks: Bloqueos, contextos y tareas | ENCAMINA<\/title>\n<meta name=\"description\" content=\"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Asincron\u00eda en C#: Bloqueos, contextos y tareas.\" \/>\n<meta property=\"og:description\" content=\"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-04T07:17:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-09-04T07:18:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Asincron\u00eda-en-Tasks.-Bloqueos-contextos-y-tareas..png\" \/>\n<meta name=\"author\" content=\"Juan Carlos Mart\u00ednez Garc\u00eda\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jcmartinezg23\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Juan Carlos Mart\u00ednez Garc\u00eda\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/\"},\"author\":{\"name\":\"Juan Carlos Mart\u00ednez Garc\u00eda\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\"},\"headline\":\"Asincron\u00eda en C#: Bloqueos, contextos y tareas.\",\"datePublished\":\"2017-09-04T07:17:38+00:00\",\"dateModified\":\"2017-09-04T07:18:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/\"},\"wordCount\":1469,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/08\\\/Imagen1-300x298.png\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/\",\"name\":\"Asincron\u00eda basada en Tasks: Bloqueos, contextos y tareas | ENCAMINA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/08\\\/Imagen1-300x298.png\",\"datePublished\":\"2017-09-04T07:17:38+00:00\",\"dateModified\":\"2017-09-04T07:18:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\"},\"description\":\"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/asincronia-en-c-bloqueos-contextos-y-tareas\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/08\\\/Imagen1.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2017\\\/08\\\/Imagen1.png\",\"width\":801,\"height\":796,\"caption\":\"Cadena de montaje\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/979c86ed9d5e671c262ed57b80f5bf44\",\"name\":\"Juan Carlos Mart\u00ednez Garc\u00eda\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g\",\"caption\":\"Juan Carlos Mart\u00ednez Garc\u00eda\"},\"description\":\"Trabajo con tecnolog\u00eda Microsoft, especialmente NET Core y Azure, adem\u00e1s de con el stack de Office 365. Estoy certificado como MCSD en Web Applications y App Builder. Me apasiona lo que hay detr\u00e1s de las tecnolog\u00edas que utilizamos los desarrolladores a diario, el c\u00f3digo limpio y desarrollar pensando en colores. Actualmente aplico todo mi buen rollo trabajando como Software &amp; Cloud Architect para ENCAMINA.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/jcmartinezg23\"],\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/jcmartinez\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Asincron\u00eda basada en Tasks: Bloqueos, contextos y tareas | ENCAMINA","description":"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/","og_locale":"es_ES","og_type":"article","og_title":"Asincron\u00eda en C#: Bloqueos, contextos y tareas.","og_description":"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2017-09-04T07:17:38+00:00","article_modified_time":"2017-09-04T07:18:17+00:00","og_image":[{"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Asincron\u00eda-en-Tasks.-Bloqueos-contextos-y-tareas..png","type":"","width":"","height":""}],"author":"Juan Carlos Mart\u00ednez Garc\u00eda","twitter_card":"summary_large_image","twitter_creator":"@jcmartinezg23","twitter_misc":{"Escrito por":"Juan Carlos Mart\u00ednez Garc\u00eda","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/"},"author":{"name":"Juan Carlos Mart\u00ednez Garc\u00eda","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44"},"headline":"Asincron\u00eda en C#: Bloqueos, contextos y tareas.","datePublished":"2017-09-04T07:17:38+00:00","dateModified":"2017-09-04T07:18:17+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/"},"wordCount":1469,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-300x298.png","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/","name":"Asincron\u00eda basada en Tasks: Bloqueos, contextos y tareas | ENCAMINA","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1-300x298.png","datePublished":"2017-09-04T07:17:38+00:00","dateModified":"2017-09-04T07:18:17+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44"},"description":"Conceptos claves del TAP (Asincron\u00eda basada en Tasks) para ahorrar dolores de cabeza a los desarrolladores que lo usan en sus aplicaciones.","inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/asincronia-en-c-bloqueos-contextos-y-tareas\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1.png","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2017\/08\/Imagen1.png","width":801,"height":796,"caption":"Cadena de montaje"},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/979c86ed9d5e671c262ed57b80f5bf44","name":"Juan Carlos Mart\u00ednez Garc\u00eda","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c450966c6fe8374bc2c6bf7c86ce77e4c7504f9ddadcb56ff46f2c16ee6e55e4?s=96&d=mm&r=g","caption":"Juan Carlos Mart\u00ednez Garc\u00eda"},"description":"Trabajo con tecnolog\u00eda Microsoft, especialmente NET Core y Azure, adem\u00e1s de con el stack de Office 365. Estoy certificado como MCSD en Web Applications y App Builder. Me apasiona lo que hay detr\u00e1s de las tecnolog\u00edas que utilizamos los desarrolladores a diario, el c\u00f3digo limpio y desarrollar pensando en colores. Actualmente aplico todo mi buen rollo trabajando como Software &amp; Cloud Architect para ENCAMINA.","sameAs":["https:\/\/x.com\/jcmartinezg23"],"url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/jcmartinez\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/126"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=630"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/630\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}