{"id":557,"date":"2025-07-27T08:59:20","date_gmt":"2025-07-27T11:59:20","guid":{"rendered":"http:\/\/www.wagnersalvi.com.br\/?p=557"},"modified":"2025-07-27T08:59:25","modified_gmt":"2025-07-27T11:59:25","slug":"programacao-assincrona-em-c","status":"publish","type":"post","link":"http:\/\/www.wagnersalvi.com.br\/?p=557","title":{"rendered":"Programa\u00e7\u00e3o Ass\u00edncrona em C#"},"content":{"rendered":"\n<p>A programa\u00e7\u00e3o ass\u00edncrona \u00e9 uma das ferramentas mais poderosas da linguagem C#. Ela permite que voc\u00ea escreva c\u00f3digo que realiza v\u00e1rias tarefas ao mesmo tempo, sem bloquear a execu\u00e7\u00e3o do programa. Neste artigo, vamos explorar a programa\u00e7\u00e3o ass\u00edncrona com <code>async<\/code> e <code>await<\/code> de forma simples, com exemplos claros e pr\u00e1ticos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que usar programa\u00e7\u00e3o ass\u00edncrona?<\/h2>\n\n\n\n<p>Imagine que voc\u00ea est\u00e1 desenvolvendo um aplicativo que precisa acessar a internet para buscar dados de uma API. Essa opera\u00e7\u00e3o pode levar alguns segundos para ser conclu\u00edda. Se voc\u00ea usar um c\u00f3digo s\u00edncrono, o aplicativo ficar\u00e1 &#8220;travado&#8221; enquanto espera a resposta, o que \u00e9 uma p\u00e9ssima experi\u00eancia para o usu\u00e1rio.<\/p>\n\n\n\n<p>Com a programa\u00e7\u00e3o ass\u00edncrona, o programa continua executando outras tarefas enquanto espera pela resposta da API, melhorando o desempenho e a fluidez da aplica\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conceitos b\u00e1sicos: async e await<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 <code>async<\/code>?<\/h3>\n\n\n\n<p>A palavra-chave <code>async<\/code> \u00e9 usada para indicar que um m\u00e9todo cont\u00e9m opera\u00e7\u00f5es ass\u00edncronas. Esse m\u00e9todo pode usar a palavra-chave <code>await<\/code> para &#8220;esperar&#8221; uma tarefa ser conclu\u00edda sem bloquear o thread principal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O que \u00e9 <code>await<\/code>?<\/h3>\n\n\n\n<p><code>await<\/code> \u00e9 usado dentro de m\u00e9todos <code>async<\/code> para aguardar a conclus\u00e3o de uma tarefa (como uma chamada \u00e0 API ou leitura de arquivo), permitindo que o restante do programa continue rodando.<\/p>\n\n\n\n<p><strong>Estrutura de um m\u00e9todo ass\u00edncrono<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public async Task MeuMetodoAssincrono()\n{\n    await Task.Delay(1000); \/\/ simula uma espera de 1 segundo\n    Console.WriteLine(\"Tarefa conclu\u00edda!\");\n}<\/pre>\n\n\n\n<p><strong>Exemplo pr\u00e1tico: buscando dados de uma API<\/strong><\/p>\n\n\n\n<p>Vamos criar um exemplo onde buscamos dados de uma API p\u00fablica de forma ass\u00edncrona.<\/p>\n\n\n\n<p>Passo 1: Criar o m\u00e9todo ass\u00edncrono<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        await BuscarDadosDaApi();\n    }\n\n    static async Task BuscarDadosDaApi()\n    {\n        HttpClient client = new HttpClient();\n\n        Console.WriteLine(\"Buscando dados...\");\n\n        HttpResponseMessage response = await client.GetAsync(\"https:\/\/jsonplaceholder.typicode.com\/posts\/1\");\n        string resultado = await response.Content.ReadAsStringAsync();\n\n        Console.WriteLine(\"Dados recebidos:\");\n        Console.WriteLine(resultado);\n    }\n}<\/pre>\n\n\n\n<p>Explica\u00e7\u00e3o:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>HttpClient<\/code> \u00e9 usado para fazer requisi\u00e7\u00f5es HTTP.<\/li>\n\n\n\n<li><code>await client.GetAsync(...)<\/code> envia a requisi\u00e7\u00e3o de forma ass\u00edncrona.<\/li>\n\n\n\n<li>Enquanto espera a resposta, o programa <strong>n\u00e3o trava<\/strong> e pode continuar executando outras tarefas.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplo com m\u00faltiplas tarefas simult\u00e2neas<\/h4>\n\n\n\n<p>Vamos simular a execu\u00e7\u00e3o de v\u00e1rias tarefas ao mesmo tempo.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">static async Task Main(string[] args)\n{\n    Task tarefa1 = TarefaDemorada(\"Tarefa 1\", 3000);\n    Task tarefa2 = TarefaDemorada(\"Tarefa 2\", 2000);\n    Task tarefa3 = TarefaDemorada(\"Tarefa 3\", 1000);\n\n    await Task.WhenAll(tarefa1, tarefa2, tarefa3);\n\n    Console.WriteLine(\"Todas as tarefas foram conclu\u00eddas.\");\n}\n\nstatic async Task TarefaDemorada(string nome, int tempo)\n{\n    Console.WriteLine($\"Iniciando {nome}\");\n    await Task.Delay(tempo);\n    Console.WriteLine($\"{nome} conclu\u00edda ap\u00f3s {tempo}ms\");\n}<\/pre>\n\n\n\n<p>O que acontece aqui?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>As tr\u00eas tarefas s\u00e3o iniciadas quase ao mesmo tempo.<\/li>\n\n\n\n<li>Cada uma tem um tempo diferente de espera (1s, 2s e 3s).<\/li>\n\n\n\n<li><code>Task.WhenAll(...)<\/code> espera que <strong>todas<\/strong> sejam conclu\u00eddas antes de seguir.<\/li>\n<\/ul>\n\n\n\n<p>Resultado esperado no console:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Iniciando Tarefa 1\nIniciando Tarefa 2\nIniciando Tarefa 3\nTarefa 3 conclu\u00edda ap\u00f3s 1000ms\nTarefa 2 conclu\u00edda ap\u00f3s 2000ms\nTarefa 1 conclu\u00edda ap\u00f3s 3000ms\nTodas as tarefas foram conclu\u00eddas.<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">Dicas importantes<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u00e9todos <code>async<\/code> devem retornar <code>Task<\/code> (ou <code>Task&lt;T><\/code> se retornarem um valor).<\/li>\n\n\n\n<li>Evite usar <code>.Result<\/code> ou <code>.Wait()<\/code>, pois eles <strong>bloqueiam<\/strong> a execu\u00e7\u00e3o e anulam os benef\u00edcios da programa\u00e7\u00e3o ass\u00edncrona.<\/li>\n\n\n\n<li>Use <code>ConfigureAwait(false)<\/code> se voc\u00ea <strong>n\u00e3o precisa voltar para o contexto original<\/strong> (por exemplo, em bibliotecas).<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Quando N\u00c3O usar programa\u00e7\u00e3o ass\u00edncrona<\/h5>\n\n\n\n<p>Embora muito \u00fatil, a programa\u00e7\u00e3o ass\u00edncrona nem sempre \u00e9 necess\u00e1ria:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Evite usar em opera\u00e7\u00f5es extremamente r\u00e1pidas (como c\u00e1lculos simples).<\/li>\n\n\n\n<li>N\u00e3o use se toda a l\u00f3gica j\u00e1 for s\u00edncrona e n\u00e3o houver chamadas a I\/O (leitura de disco, rede, etc.).<\/li>\n<\/ul>\n<p>Views: 1<\/p>","protected":false},"excerpt":{"rendered":"<p>A programa\u00e7\u00e3o ass\u00edncrona \u00e9 uma das ferramentas mais poderosas da linguagem C#. Ela permite que voc\u00ea escreva c\u00f3digo que realiza [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":559,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[49],"tags":[62],"class_list":["post-557","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","tag-c"],"_links":{"self":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=557"}],"version-history":[{"count":1,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/557\/revisions"}],"predecessor-version":[{"id":558,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/557\/revisions\/558"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/media\/559"}],"wp:attachment":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=557"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}