{"id":144,"date":"2023-12-10T12:38:18","date_gmt":"2023-12-10T15:38:18","guid":{"rendered":"https:\/\/dotnetdicas.com.br\/?p=144"},"modified":"2023-12-10T17:21:58","modified_gmt":"2023-12-10T20:21:58","slug":"evite-o-uso-inadequado-do-foreach-com-operacoes-assincronas","status":"publish","type":"post","link":"https:\/\/dotnetdicas.com.br\/?p=144","title":{"rendered":"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas"},"content":{"rendered":"<p><span style=\"font-family: verdana, geneva, sans-serif;\">Ol\u00e1, Devs! Bem-vindos a mais um insight sobre <a href=\"https:\/\/learn.microsoft.com\/pt-br\/dotnet\/csharp\/tour-of-csharp\/\" target=\"_blank\" rel=\"noopener\">programa\u00e7\u00e3o C#<\/a>. Frequentemente, encontramos m\u00e9todos em C# que parecem eficientes \u00e0 primeira vista, mas podem levar a resultados inesperados. Dominar t\u00e9cnicas ass\u00edncronas \u00e9 crucial para desenvolver c\u00f3digo eficiente e confi\u00e1vel. Um exemplo t\u00edpico de uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso inadequado do <strong>ForEach<\/strong> com opera\u00e7\u00f5es ass\u00edncronas.\u00a0Neste artigo, vamos mergulhar nas melhores pr\u00e1ticas de programa\u00e7\u00e3o ass\u00edncrona em C#, explicando por que essa abordagem pode ser inadequada e apresentando alternativas mais eficazes.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\"><strong>1. Uso do ForEach com opera\u00e7\u00f5es ass\u00edncronas<\/strong><\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">A aplica\u00e7\u00e3o do <strong>ForEach<\/strong> em contextos ass\u00edncronos em C# pode parecer tentadora, mas esconde armadilhas. O m\u00e9todo \u00e9 intrinsecamente <em>s\u00edncrono<\/em> e, ao inserir opera\u00e7\u00f5es <em>ass\u00edncronas<\/em> dentro dele, como mostrado no exemplo abaixo, as tarefas n\u00e3o s\u00e3o gerenciadas como esperado:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-154\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1-300x90.png\" alt=\"ForEach problem\u00e1tico\" width=\"737\" height=\"221\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1-300x90.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1-768x231.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1.png 1024w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Quando voc\u00ea usa o <strong>ForEach<\/strong> em cen\u00e1rios ass\u00edncronos, isso pode causar comportamentos n\u00e3o intencionais e problem\u00e1ticos. O problema ocorre porque o <strong>ForEach<\/strong> n\u00e3o aguarda a conclus\u00e3o das tarefas ass\u00edncronas, o que pode resultar em comportamentos inesperados ou erros.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">2. Desafios na concorr\u00eancia e gerenciamento de exce\u00e7\u00f5es<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">O uso indevido de <strong>async<\/strong> com <strong>ForEach<\/strong> em C# pode causar complica\u00e7\u00f5es, especialmente em termos de concorr\u00eancia e gerenciamento de exce\u00e7\u00f5es. Al\u00e9m disso, a execu\u00e7\u00e3o simult\u00e2nea de tarefas ass\u00edncronas pode resultar em conflitos. Isso, por sua vez, dificulta a captura de exce\u00e7\u00f5es de maneira eficaz, aumentando o risco de erros n\u00e3o detectados no seu c\u00f3digo.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">3. Abordagem sequencial: combinando foreach e await<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Para assegurar uma execu\u00e7\u00e3o ass\u00edncrona adequada em C#, uma boa alternativa \u00e9 usar um loop <strong>foreach<\/strong> com <strong>await<\/strong>. De fato, este m\u00e9todo permite processar cada opera\u00e7\u00e3o de forma <strong>sequencial<\/strong>, minimizando assim os riscos de concorr\u00eancia. Dessa forma, voc\u00ea evita os problemas comuns associados a execu\u00e7\u00f5es paralelas descontroladas, garantindo um fluxo mais est\u00e1vel e previs\u00edvel no processamento de suas tarefas.<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-156\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach2-1024x308-1-300x90.png\" alt=\"ForEach sequencial\" width=\"737\" height=\"221\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach2-1024x308-1-300x90.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach2-1024x308-1-768x231.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach2-1024x308-1.png 1024w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Esta abordagem oferece um controle melhor sobre as opera\u00e7\u00f5es ass\u00edncronas.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">4. Execu\u00e7\u00e3o paralela segura com Task.WhenAll<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Quando a execu\u00e7\u00e3o paralela \u00e9 vi\u00e1vel e segura, <strong>Task.WhenAll<\/strong> se torna a escolha ideal para opera\u00e7\u00f5es ass\u00edncronas em C#. Ele gerencia a execu\u00e7\u00e3o de m\u00faltiplas tarefas ass\u00edncronas de forma eficiente:<\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-157\" src=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach3-1024x308-1-300x90.png\" alt=\"ForEach com opera\u00e7\u00e3o ass\u00edncrona\" width=\"740\" height=\"222\" srcset=\"https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach3-1024x308-1-300x90.png 300w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach3-1024x308-1-768x231.png 768w, https:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach3-1024x308-1.png 1024w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/span><\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Este m\u00e9todo \u00e9 ideal para cen\u00e1rios onde as opera\u00e7\u00f5es s\u00e3o independentes entre si.<\/span><\/p>\n<h3><span style=\"font-family: verdana, geneva, sans-serif;\">4. Conclus\u00e3o<\/span><\/h3>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Ao trabalhar com <strong>async<\/strong> em C#, \u00e9 essencial escolher estrat\u00e9gias que alinhem com as necessidades espec\u00edficas do seu c\u00f3digo. Portanto, evitar pr\u00e1ticas comuns, como o uso inadequado do <strong>ForEach<\/strong> para opera\u00e7\u00f5es ass\u00edncronas, \u00e9 crucial. Em contraste, optar por <strong>foreach<\/strong> ou <strong>Task.WhenAll<\/strong> pode significar a diferen\u00e7a entre um c\u00f3digo problem\u00e1tico e um c\u00f3digo eficaz e robusto. Consequentemente, essa escolha cuidadosa garante a cria\u00e7\u00e3o de solu\u00e7\u00f5es mais confi\u00e1veis e de alto desempenho.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">Na programa\u00e7\u00e3o C#, entender e aplicar corretamente pr\u00e1ticas ass\u00edncronas \u00e9 a chave para criar aplica\u00e7\u00f5es confi\u00e1veis e de alto desempenho. Lembre-se, as melhores pr\u00e1ticas de <strong>async<\/strong> n\u00e3o s\u00e3o apenas sobre escrever c\u00f3digo, mas sobre escrever c\u00f3digo que seja seguro, confi\u00e1vel e eficiente.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: verdana, geneva, sans-serif;\">At\u00e9 a pr\u00f3xima!!!<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, Devs! Bem-vindos a mais um insight sobre programa\u00e7\u00e3o C#. Frequentemente, encontramos m\u00e9todos em C# que parecem eficientes \u00e0 primeira vista, mas podem levar a resultados inesperados. Dominar t\u00e9cnicas ass\u00edncronas \u00e9 crucial para desenvolver c\u00f3digo eficiente e confi\u00e1vel. Um exemplo t\u00edpico de uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso inadequado do [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte<\/title>\n<meta name=\"description\" content=\"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dotnetdicas.com.br\/?p=144\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte\" \/>\n<meta property=\"og:description\" content=\"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dotnetdicas.com.br\/?p=144\" \/>\n<meta property=\"og:site_name\" content=\"DotNetDicas - C\u00f3digo forte, Carreira mais forte\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-10T15:38:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-10T20:21:58+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1-300x90.png\" \/>\n<meta name=\"author\" content=\"L\u00facio Torres\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"L\u00facio Torres\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=144\",\"url\":\"https:\/\/dotnetdicas.com.br\/?p=144\",\"name\":\"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte\",\"isPartOf\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/#website\"},\"datePublished\":\"2023-12-10T15:38:18+00:00\",\"dateModified\":\"2023-12-10T20:21:58+00:00\",\"author\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa\"},\"description\":\"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...\",\"breadcrumb\":{\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=144#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dotnetdicas.com.br\/?p=144\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/dotnetdicas.com.br\/?p=144#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/dotnetdicas.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#website\",\"url\":\"https:\/\/dotnetdicas.com.br\/\",\"name\":\"DotNetDicas - C\u00f3digo forte, Carreira mais forte\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dotnetdicas.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa\",\"name\":\"L\u00facio Torres\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g\",\"caption\":\"L\u00facio Torres\"},\"sameAs\":[\"https:\/\/dotnetdicas.com.br\"],\"url\":\"https:\/\/dotnetdicas.com.br\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte","description":"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...","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:\/\/dotnetdicas.com.br\/?p=144","og_locale":"pt_BR","og_type":"article","og_title":"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte","og_description":"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...","og_url":"https:\/\/dotnetdicas.com.br\/?p=144","og_site_name":"DotNetDicas - C\u00f3digo forte, Carreira mais forte","article_published_time":"2023-12-10T15:38:18+00:00","article_modified_time":"2023-12-10T20:21:58+00:00","og_image":[{"url":"http:\/\/dotnetdicas.com.br\/wp-content\/uploads\/2023\/12\/foreach1-1024x308-1-300x90.png"}],"author":"L\u00facio Torres","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"L\u00facio Torres","Est. tempo de leitura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dotnetdicas.com.br\/?p=144","url":"https:\/\/dotnetdicas.com.br\/?p=144","name":"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas - DotNetDicas - C\u00f3digo forte, Carreira mais forte","isPartOf":{"@id":"https:\/\/dotnetdicas.com.br\/#website"},"datePublished":"2023-12-10T15:38:18+00:00","dateModified":"2023-12-10T20:21:58+00:00","author":{"@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa"},"description":"Uma pr\u00e1tica comum, mas muitas vezes mal aplicada, \u00e9 o uso do m\u00e9todo ForEach com opera\u00e7\u00f5es ass\u00edncronas. Neste artigo, vamos mergulhar nas...","breadcrumb":{"@id":"https:\/\/dotnetdicas.com.br\/?p=144#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dotnetdicas.com.br\/?p=144"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dotnetdicas.com.br\/?p=144#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/dotnetdicas.com.br\/"},{"@type":"ListItem","position":2,"name":"ForEach com Opera\u00e7\u00f5es Ass\u00edncronas"}]},{"@type":"WebSite","@id":"https:\/\/dotnetdicas.com.br\/#website","url":"https:\/\/dotnetdicas.com.br\/","name":"DotNetDicas - C\u00f3digo forte, Carreira mais forte","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dotnetdicas.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/368975f3d3f2d0c3c1d7b176c555b3fa","name":"L\u00facio Torres","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/dotnetdicas.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c4d33f0feb1d62f7769da1983149ca69?s=96&d=mm&r=g","caption":"L\u00facio Torres"},"sameAs":["https:\/\/dotnetdicas.com.br"],"url":"https:\/\/dotnetdicas.com.br\/?author=2"}]}},"_links":{"self":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/144"}],"collection":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=144"}],"version-history":[{"count":10,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":163,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions\/163"}],"wp:attachment":[{"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dotnetdicas.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}