<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6626108615401234991</id><updated>2011-11-27T15:55:18.943-08:00</updated><category term='treinamento'/><category term='tron'/><category term='Certificação'/><category term='itumbiara'/><category term='célula'/><category term='qualidade'/><category term='silverlight'/><category term='patterns'/><category term='viagem'/><category term='arquitetura'/><category term='MCP'/><category term='wf'/><category term='fibonacci'/><category term='pair-programing'/><category term='c#'/><category term='Certificado'/><category term='Profissional'/><category term='scrum'/><category term='agile'/><category term='Artigos'/><category term='wcf reflection generics operationcontract servicecontract action'/><category term='MCTS'/><category term='consultoria'/><category term='code-review'/><category term='Goiânia'/><category term='teste de software'/><category term='xp'/><category term='aula'/><category term='palestra'/><title type='text'>Fred Policarpo -  Desenvolvimento de Software</title><subtitle type='html'>Blog sobre desenvolvimento de Software, com foco em .NET, WCF, WPF, WF, Silverlight e metodologias ágeis.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-1705412279634762586</id><published>2009-10-01T07:59:00.000-07:00</published><updated>2009-10-01T09:59:55.648-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='palestra'/><category scheme='http://www.blogger.com/atom/ns#' term='célula'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='itumbiara'/><category scheme='http://www.blogger.com/atom/ns#' term='viagem'/><category scheme='http://www.blogger.com/atom/ns#' term='wf'/><title type='text'>.NET Open Day (Itumbiara - 30/09/2009)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_AGzecjLaMYE/SsTZs8GmEOI/AAAAAAAABmk/naZYIErX-dk/s1600-h/Folder.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 224px; height: 320px;" src="http://4.bp.blogspot.com/_AGzecjLaMYE/SsTZs8GmEOI/AAAAAAAABmk/naZYIErX-dk/s320/Folder.jpg" alt="" id="BLOGGER_PHOTO_ID_5387670420313215202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O evento .NET Open Day superou minhas expectativas! O pessoal participou em peso, muita gente mesmo.&lt;br /&gt;&lt;br /&gt;A primeira boa impressão que tive foi a receptividade do pessoal do curso de Sistema de Informação, eles realmente foram muito gentis conosco (Marcos e eu). A simpatia, sem dúvidas, é uma ferramenta importantíssima para um bom networking.&lt;br /&gt;&lt;br /&gt;A segunda surpresa foi o número de pessoas no auditório, que estava muito cheio, praticamente lotado. O Gesmar até tinha me falado do grande interresse do pessoal, mas de certa forma eu estava receoso quanto à empolgação da qual ele falou.&lt;br /&gt;&lt;br /&gt;Esse interesse dos alunos é de suma importância para o crescimento profissional dos mesmos, Além do mais, essas oportunidades que surgem na faculdade tem de ser agarradas com força, pois pode ser que na vida de profissional seja um pouco mais difícil de participar delas.&lt;br /&gt;&lt;br /&gt;Durante a palestra do Gesmar tive conhecimento de outra coisa que me deixou bastante satisfeito: o número de pessoas que está participando da célula atualmente. A lista realmente é grande. Deixo meu total incentivo para que continuem com força total nas atividades, e faço questão de dar uma forcinha sempre que possível. Escrevam muito código pois programar se aprende pogramando.&lt;br /&gt;&lt;br /&gt;Durante minhas palestras, primeiro de Windows Workflow Foundation e depois de Silverlight, gostei de ver que o pessoal manteve boa atenção em tudo que eu estava passando, mesmo sendo um assunto técnico e às vezes confuso para alguns. Além do mais notei que poucas pessoas sairam do auditório durante todo evento, o que também considero um ótimo resultado.&lt;br /&gt;&lt;br /&gt;E para fechar a noite fomos pra um bar local, o &lt;span style="font-style: italic;"&gt;Academia do Chopp&lt;/span&gt;, para fazer uma confraternização onde falamos de .NET, mercado de trabalho, futebol e atitude!&lt;br /&gt;&lt;br /&gt;Foi uma ótima experiência, espero voltar a Itumbiara para realizar outras atividades com o pessoal da Ulbra.&lt;br /&gt;&lt;br /&gt;O material já está disponível, em breve fotos e videos.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="Preview" marginheight="0" marginwidth="0" style="padding: 0pt; width: 200px; height: 115px; background-color: rgb(252, 252, 252);" src="http://cid-f50143d26a81fd3c.skydrive.live.com/embedicon.aspx/.Public/FredPolicarpoOpenDay.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Abraços,&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Fred Policarpo&lt;/span&gt;&lt;br /&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor/Desenvolvedor - Fibonacci Soluções Ágeis - &lt;a href="http://solucoesageis.com.br/" target="_blank"&gt;http://fibonacci.inf.br&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-1705412279634762586?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/1705412279634762586/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=1705412279634762586' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1705412279634762586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1705412279634762586'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/10/net-open-day-itumbiara-30092009.html' title='.NET Open Day (Itumbiara - 30/09/2009)'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AGzecjLaMYE/SsTZs8GmEOI/AAAAAAAABmk/naZYIErX-dk/s72-c/Folder.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-1315779173857183205</id><published>2009-09-10T14:05:00.000-07:00</published><updated>2009-09-11T08:38:31.045-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fibonacci'/><category scheme='http://www.blogger.com/atom/ns#' term='consultoria'/><category scheme='http://www.blogger.com/atom/ns#' term='tron'/><category scheme='http://www.blogger.com/atom/ns#' term='treinamento'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura'/><title type='text'>Treinamento Framework.NET - Tron Informática</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_AGzecjLaMYE/SqlxXhZywAI/AAAAAAAABls/8J3onH_DxKY/s1600-h/PICT0169.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 308px; height: 247px;" src="http://4.bp.blogspot.com/_AGzecjLaMYE/SqlxXhZywAI/AAAAAAAABls/8J3onH_DxKY/s400/PICT0169.JPG" alt="" id="BLOGGER_PHOTO_ID_5379955878788251650" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_AGzecjLaMYE/Sql2QrmUpyI/AAAAAAAABl0/fGMVTmJoCOs/s1600-h/PICT0180.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 329px; height: 247px;" src="http://2.bp.blogspot.com/_AGzecjLaMYE/Sql2QrmUpyI/AAAAAAAABl0/fGMVTmJoCOs/s320/PICT0180.JPG" alt="" id="BLOGGER_PHOTO_ID_5379961258824214306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Na terça-feira passada (08/09/2009) finalizei o treinamento sobre o Framework.NET da &lt;a href="http://tron.com.br/"&gt;Tron Informática&lt;/a&gt;. O treinamento, que teve duração de uma semana, pois iniciou-se dia 01/09/2009, foi ministrado a três equipes: desenvolvimento, manutenção e homologação.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Antes de mais nada é necessário explicar do que estou falando! O Framework.NET em questão é um software que foi desenvolvido pela Tron Informática em parceria com a &lt;a href="http://fibonacci.inf.br/"&gt;Fibonacci - Soluções Ágeis,&lt;/a&gt; durante um contrato de consultoria em arquitetura de software solicitado pela Tron. Essa consultoria, que teve duração de quatro meses, teve como objetivo a preparação de um framework para desenvolvimento de aplicações web com .NET 3.5, que será a tecnologia usada para construção dos novos produtos da Tron. Essa consultoria foi aplicada por mim(&lt;a href="http://twitter.com/fredpolicarpo"&gt;Fred Policarpo&lt;/a&gt;) e pelo &lt;a href="http://twitter.com/marciorja"&gt;Márcio Siqueira&lt;/a&gt; (sócio/diretor da Fibonacci). O  representante do cliente foi o &lt;a href="http://twitter.com/wevertongomes"&gt;Weverton Gomes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Agora que já sabemos que o Framework.NET, produto da Tron, não é a mesma coisa que o .NET Framework, produto da Microsoft, posso continuar a falar sobre o treinamento.&lt;br /&gt;&lt;br /&gt;Durante esses cinco dias de aula tivemos grande foco em explicar a importância do Desenvolvimento Orientado a Testes (&lt;a href="http://improveit.com.br/xp/praticas/tdd"&gt;TDD&lt;/a&gt;), da Orientação a Objetos (&lt;a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos"&gt;OO&lt;/a&gt;), das responsabilidades de cada camada das aplicações que serão construídas tendo como base esse framework, e também das facilidades que o mesmo irá proporcionar aos usuários(códigos reutilisáveis, diversas funcionalidades comuns às aplicações já disponíveis, além de uma ferramenta de automatização para acelerar ainda mais o desenvolvimento)&lt;br /&gt;&lt;br /&gt;Foi muito produtivo ter trabalhado durante esses quatro meses com o que há de mais recente no mundo .NET (como LINQ, WCF e Silverlight 3) assim como foi excelente ter a oportunidade de passar um pouco desse conhecimento para as equipes que irão trabalhar com esse framework.&lt;br /&gt;&lt;br /&gt;Mudanças de conceito são sempre um passo difícil para a maioria das pessoas, e eu me incluo nesse conjunto. Mesmo assim, percebi uma vontade de aprender dos profissionais que lá estavam  e acredito que, com a decicação e paciência adequada, eles irão se adaptar e confirmar a melhoria de produtividade e qualidade que o Framework.NET irá oferecer aos produtos a serem desenvolvidos.&lt;br /&gt;&lt;br /&gt;Deixo então meu agradecimento à &lt;span style="font-style: italic;"&gt;Fibonacci - Solulções Ágeis&lt;/span&gt; por ter confiado meu trabalho neste projeto, à &lt;span style="font-style: italic;"&gt;Tron&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Informática&lt;/span&gt; por ter confiado essa responsabilidade à Fibonacci e à mim(que sou apenas um jovem desenvolvedor), ao &lt;span style="font-style: italic;"&gt;Weverton&lt;/span&gt; por ter tido paciência com as questões que eu também desconhecia e que tivemos que aprender juntos, e ao pessoal que acompanhou o treinamento e conseguiu manter a atenção e dedicação apesar do horário puxado. Obrigado a todos.&lt;br /&gt;&lt;br /&gt;Às empresas que tiverem interesse, a Fibonacci possui uma equipe de arquitetos prontos para dar treinamento e consultoria em arquitetura\desenvolvimento de software(.NET, Grails, Ruby on Rails, Java) e também em metodologias ágeis.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abraços,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fred Policarpo&lt;/span&gt;&lt;br /&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor/Desenvolvedor - Fibonacci Soluções Ágeis - &lt;a href="http://solucoesageis.com.br/" target="_blank"&gt;http://fibonacci.inf.br&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-1315779173857183205?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/1315779173857183205/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=1315779173857183205' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1315779173857183205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1315779173857183205'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/09/treinamento-frameworknet-tron.html' title='Treinamento Framework.NET - Tron Informática'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AGzecjLaMYE/SqlxXhZywAI/AAAAAAAABls/8J3onH_DxKY/s72-c/PICT0169.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-7866711314285284177</id><published>2009-08-26T04:06:00.000-07:00</published><updated>2009-08-26T07:29:46.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teste de software'/><category scheme='http://www.blogger.com/atom/ns#' term='palestra'/><category scheme='http://www.blogger.com/atom/ns#' term='qualidade'/><title type='text'>Como matar uma palestra</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www1.istockphoto.com/file_thumbview_approve/697987/2/istockphoto_697987_mystery_novel_crime.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 380px; height: 305px;" src="http://www1.istockphoto.com/file_thumbview_approve/697987/2/istockphoto_697987_mystery_novel_crime.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;Ontem fui a uma palestra sobre testes e qualidade de software, marcada para as 19hs de uma terça-feira comum. Para quem trabalha o dia todo, nada melhor do que uma palestra que será depois do expediente, ainda mais de graça, como foi essa em questão.&lt;br /&gt;&lt;br /&gt;O tema então é excelente, pelo menos eu estou de acordo que testes e qualidade de software são assuntos de suma importância para o sucesso de sistema de computador, ou de qualquer sistema.&lt;br /&gt;&lt;br /&gt;Porém nem tudo na vida são flores, a começar com um atraso de &lt;span style="font-weight: bold;"&gt;50 minutos&lt;/span&gt;. É isso mesmo, quase uma hora!&lt;br /&gt;&lt;br /&gt;Então vamos à primeira coisa que mata uma palestra:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Atraso maior do que 15 minutos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esse problema pode não ser culpa direta do palestrante e sim da organização, porém o fato de ser em um dia de semana, onde a grande maioria das pessoas passou por uma jornada cansativa de oito, ou  mais, horas de trabalho, é extremamente desconfortável um atraso tão grande.&lt;br /&gt;&lt;br /&gt;Segundo tiro no pé:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Falta de objetividade&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Novamente o fato de ser em um dia de semana faz com que algumas atitudes tornem a palestra muito cansativa.&lt;br /&gt;&lt;br /&gt;Para essa palestra o público era seleto, estudantes, professores, profissionais e empresários.&lt;br /&gt;&lt;br /&gt;Considerando esse público, o palestrante não precisa de 3 minutos para explicar que um código com 1000 linhas de código é mais complexo do que um com 10 linhas de código, e muito menos de 10 minutos para explicar que na realidade as empresas  corrigem os erros e não os previnem.  Essas duas coisas poderiam ser ditas em apenas um minuto, seria melhor para todos se fosse assim. Esses devaneios vão consumindo a paciência do público, a minha então já estava ficando com saldo negativo.&lt;br /&gt;&lt;br /&gt;Terceira atitude negativa:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comparar engenharia de software com engenharia civil, programadores com pedreiros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Já não é de hoje que existem pesquisas e mais pesquisas mostrando que um dos maiores erros da indústria de software é tentar seguir o modelo das fábricas tradicionais, o Taylorismo, e seguir os passos das engenharias tradicionais: cívil, automobilística, etc.. No mundo do software o pedreiro é o compilador, será difícil, para uma pessoa com tantos anos de experiência, entender isso?&lt;br /&gt;&lt;br /&gt;Insistir nessa comparação ilógica é como se alguém insistisse que é melhor usar a linguagem C para desenvolver sistemas de informação para Web do que usar .NET, Java, Grails ou Ruby On Rails.&lt;br /&gt;&lt;br /&gt;Como palestrante eu ainda não tenho experiência, mas como ouvinte eu posso dar minha opinião sobre o que atrai ou não a atenção da platéia, e está dito!&lt;br /&gt;&lt;br /&gt;Abraços,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fred Policarpo&lt;/span&gt;&lt;br /&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor/Desenvolvedor - Fibonacci Soluções Ágeis - &lt;a href="http://solucoesageis.com.br/" target="_blank"&gt;http://solucoesageis.com.br&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-7866711314285284177?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/7866711314285284177/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=7866711314285284177' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/7866711314285284177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/7866711314285284177'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/08/como-matar-uma-palestra.html' title='Como matar uma palestra'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-1690972457377370970</id><published>2009-08-11T08:26:00.000-07:00</published><updated>2009-08-11T09:48:30.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wcf reflection generics operationcontract servicecontract action'/><title type='text'>Obtendo todas actions de um serviço WCF</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quando se trabalha com WCF você precisa de uma interface que irá definir o contrato do serviço a ser disponibilizado com esta tecnologia.&lt;br /&gt;&lt;br /&gt;Essa interface deve ser marcada com o atributo &lt;span style="font-weight: bold;"&gt;ServiceContract&lt;/span&gt;, e cada método desta interface que deverá estar disponível pelo serviço deve ser marcado com o atributo &lt;span style="font-weight: bold;"&gt;OperationContract&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se você estiver muito confuso sobre o que falei até o momento aconselho que dê uma lida neste artigo de introdução aos serviços em WCF: &lt;a href="http://www.linhadecodigo.com.br/Artigo.aspx?id=2314"&gt;Introdução ao WCF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O atributo &lt;span style="font-weight: bold;"&gt;OperationContract&lt;/span&gt; contém uma série de proriedades, uma delas é a &lt;span style="font-weight: bold;"&gt;Action&lt;/span&gt; (&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.action.aspx"&gt;detalhes&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A propriedade &lt;span style="font-weight: bold;"&gt;Action &lt;/span&gt;é usada para identificar de forma única a operação equivalente. No projeto em que estou trabalhando aparece a necessidade se determinar, em tempo de execução, qual a lista completa de actions das operações disponíveis em um dado contrato de serviço (a interface).  Após algumas análises conseguimos o seguinte código que, via reflexão, nos retorna uma lista de strings com todas actions de um dado serviço:&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public static &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;IList&lt;/span&gt;&lt;/span&gt;&lt;string&gt;&lt;span style="color: rgb(0, 204, 204);"&gt; &lt;/span&gt;ObtenhaTodasOperacoes&lt;t&gt;&lt;t&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/span&gt;actions = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;List&lt;/span&gt;&lt;string&gt;();&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach &lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;var &lt;/span&gt;method &lt;span style="color: rgb(51, 51, 255);"&gt;in &lt;/span&gt;typeof(T).GetMethods())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/span&gt;att = (&lt;span style="color: rgb(0, 204, 204);"&gt;OperationContractAttribute&lt;/span&gt;)&lt;span style="color: rgb(0, 204, 204);"&gt;Attribute&lt;/span&gt;.GetCustomAttribute(method, &lt;span style="color: rgb(51, 51, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(0, 204, 204);"&gt;OperationContractAttribute&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/string&gt;&lt;/t&gt;&lt;/t&gt;        &lt;string&gt;&lt;t&gt;&lt;string&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &lt;/span&gt;(att != &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;) actions.Add(att.Action);&lt;br /&gt;&lt;/string&gt;&lt;/t&gt;&lt;/string&gt;    &lt;string&gt;&lt;t&gt;&lt;string&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/string&gt;&lt;/t&gt;&lt;/string&gt;&lt;string style="font-weight: bold;"&gt;&lt;t&gt;&lt;string&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/string&gt;&lt;/t&gt;&lt;/string&gt;    &lt;string&gt;&lt;t&gt;&lt;string&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/span&gt;actions;&lt;br /&gt;}&lt;/string&gt;&lt;/t&gt;&lt;/string&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Na verdade a implementação está mais relacionada a Reflections do que a WCF, porém é uma utilidade que os usuários de WCF podem precisar no decorrer de seu projeto.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;É isso,&lt;br /&gt;&lt;br /&gt;Abraços,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fred Policarpo&lt;/span&gt;&lt;br /&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor em Arquitetura de Software na Fibonacci Soluções Ágeis - &lt;a href="http://solucoesageis.com.br/" target="_blank"&gt;http://solucoesageis.com.br&lt;/a&gt;&lt;/string&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-1690972457377370970?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/1690972457377370970/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=1690972457377370970' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1690972457377370970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1690972457377370970'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/08/obtendo-todas-actions-de-um-servico-wcf.html' title='Obtendo todas actions de um serviço WCF'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-4519164598877874223</id><published>2009-07-27T17:58:00.000-07:00</published><updated>2009-07-28T04:15:18.551-07:00</updated><title type='text'>Aula na Fibonacci - TDD + Singleton</title><content type='html'>&lt;div align="justify"&gt;Conforme foi dito no &lt;a href="http://fredpolicarpo.blogspot.com/2009/07/aula-sobre-padroes-criacionais-com-c-35.html"&gt;post &lt;/a&gt;anterior, eu estava planejando uma aula para os dedicados alunos da Célula .NET da Faculdade Objetivo. Tudo deu certo e essa aula realmente aconteceu no dia 25/07/2009 em uma das salas de desenvolvimento da Fibonacci - Soluções Ágeis.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;O tempo foi muito curto para tudo que eu gostaria de passar para o pessoal, não por culpa do tempo, mas por culpa da minha imensa vontade de passar o máximo de informações importantes para eles. Porém não adianta ter pressa, a coisa precisa ser bem feita antes de mais nada, por isso mesmo focamos em dois assuntos principais: TDD e o Padrão Singleton.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Os outros assuntos mercem uma aula dedicada cada um, são eles: Reflection, Padrão Factory, Configuração, Convensão sobre Configuração e Generics. Ufa é muita coisa para uma manhã só mesmo. Outras manhãs virão e esses assuntos ainda serão focados ;-P&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Agradeço ao Rogério, à Ana Paula e ao Marcos pela persença. Continuem se esforçando, e principalmente escrevendo muito código! Agradeço também à Fibonacci - Soluções Ágeis que cedeu o espaço e os equipamentos.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Abaixo seguem a fotos, de qualidade duvidosa, da nossa primeira aula e também o link para obter os slides usados na mesma.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Um grande abraço e até breve.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Fred Policarpo&lt;/div&gt;&lt;div align="left"&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor em Arquitetura de Software na Fibonacci Soluções Ágeis - &lt;a href="http://fibonacci.inf.br/" target="_blank"&gt;http://fibonacci.inf.br/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://svlvcg.bay.livefilestore.com/y1pvreDR2w244s0CS959ykyhv8elDckzJsZdQ65pMzMu4k0SA_kKQHzbhzhNWCirXqABnc42Wwt3DXvpfTUQqjKMLlWhRR6S-Ik/AulaPadroesCriacionais.pptx?download"&gt;Baixar Material&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;a href="http://3.bp.blogspot.com/_AGzecjLaMYE/Sm5Nv6-PwCI/AAAAAAAABjw/L06mvH1qZbU/s1600-h/aula_02.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5363309691924365346" style="margin: 0px auto 10px; display: block; width: 400px; height: 300px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_AGzecjLaMYE/Sm5Nv6-PwCI/AAAAAAAABjw/L06mvH1qZbU/s400/aula_02.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_AGzecjLaMYE/Sm5NprBtcqI/AAAAAAAABjo/QPPOw3M3eDU/s1600-h/aula_01.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5363309584564712098" style="margin: 0px auto 10px; display: block; width: 400px; height: 300px; text-align: center;" alt="" src="http://4.bp.blogspot.com/_AGzecjLaMYE/Sm5NprBtcqI/AAAAAAAABjo/QPPOw3M3eDU/s400/aula_01.JPG" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-4519164598877874223?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/4519164598877874223/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=4519164598877874223' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4519164598877874223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4519164598877874223'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/07/aula-na-fibonacci-tdd-singleton.html' title='Aula na Fibonacci - TDD + Singleton'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AGzecjLaMYE/Sm5Nv6-PwCI/AAAAAAAABjw/L06mvH1qZbU/s72-c/aula_02.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-8828277124912806456</id><published>2009-07-23T08:28:00.000-07:00</published><updated>2009-07-23T09:14:41.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='aula'/><title type='text'>Aula sobre Padrões Criacionais com C# 3.5</title><content type='html'>&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 213px;" src="http://3.bp.blogspot.com/_AGzecjLaMYE/SmiEbsZ2DsI/AAAAAAAABi4/_ozTo2RP-zE/s320/QuebraCabeca.jpg" alt="" id="BLOGGER_PHOTO_ID_5361680967695470274"/&gt;Neste sábado, dia 25/07/2009, ministrarei uma aula sobre três padrões criacionais da Gange dos Quatro (GoF), são eles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abstract Factory&lt;/li&gt;&lt;li&gt;Factory Method&lt;/li&gt;&lt;li&gt;Singleton&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;O foco deste estudo não é apenas os padrões em si, que são simples de compreender, também será enfatizada a técnica de TDD (&lt;span style="font-style: italic;"&gt;Test Driven Devlopment&lt;/span&gt;). Da parte do .NET Framework serão focados os seguintes tópicos:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Reflexão&lt;/li&gt;&lt;li&gt;Configurações (App.Config)&lt;/li&gt;&lt;li&gt;Generics&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;O estudo será realizado utilizando a linguagem C# 3.5 com o Visual Studio 2008. Esta é uma parceira minha (&lt;span style="font-weight: bold;"&gt;Fred Policarpo&lt;/span&gt;) com o pessoal da Célula Acadêmica .NET da Faculdade Objetivo (Goiânia - GO) com apoio da &lt;a href="http://fibonacci.inf.br/"&gt;Fibonacci - Soluções Ágeis&lt;/a&gt;, que irá fornecer toda infraestrutura para esta aula.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Caso você não seja desta célula e deseje participar mande-me uma &lt;span style="font-style: italic;"&gt;direct message&lt;/span&gt; no &lt;a href="http://twitter.com/fredpolicarpo"&gt;Twitter&lt;/a&gt; para que eu possa checar se ainda há vagas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Abraços,&lt;br /&gt;&lt;br /&gt;Fred Policarpo&lt;br /&gt;MCP - Microsoft Certified Professional&lt;br /&gt;MCTS: .NET Framework 2.0 Windows Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Presentation Foundation Applications&lt;br /&gt;MCTS: .NET Framework 3.5 Windows Workflow Foundation Applications&lt;br /&gt;Consultor em Arquitetura de Software na Fibonacci Soluções Ágeis - &lt;a href="http://solucoesageis.com.br/" target="_blank"&gt;http://solucoesageis.com.br&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-8828277124912806456?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/8828277124912806456/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=8828277124912806456' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/8828277124912806456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/8828277124912806456'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/07/aula-sobre-padroes-criacionais-com-c-35.html' title='Aula sobre Padrões Criacionais com C# 3.5'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AGzecjLaMYE/SmiEbsZ2DsI/AAAAAAAABi4/_ozTo2RP-zE/s72-c/QuebraCabeca.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-123566243668349843</id><published>2009-07-09T08:24:00.000-07:00</published><updated>2009-07-09T09:58:35.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='code-review'/><category scheme='http://www.blogger.com/atom/ns#' term='pair-programing'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Programação em Par vs Revisão de Código</title><content type='html'>&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 406px; height: 300px;" src="http://people.maths.ox.ac.uk/%7Efletcher/graphics/pair_programming.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Enquanto o Extreming Programming(XP) tem como uma das suas práticas a programação em par, o Scrum utiliza a revisão de código. Quais das duas usar em seu projeto ? Qual é a melhor estratégia ?&lt;br /&gt;&lt;br /&gt;Se você já tiver uma pequena noção sobre metodologias ágeis sabe que não existe uma resposta universal para as perguntas acima, a resposta certa é &lt;span style="font-style: italic; font-weight: bold;"&gt;"depende"&lt;/span&gt;. Obviamente se eu faço essas perguntas, dou essa resposta e então finalizo o post, tenho certeza de que perderei muitos leitores.&lt;br /&gt;&lt;br /&gt;O objetivo deste texo é explicar algumas vantagens e desvantagens de cada uma dessas estratégias, quando e por que utilizá-las, além de mostrar a estratégia adotada com a equipe do projeto FPw Workflow (produto da LG Sistemas desenvolvido e mantido pela Fibonacci - Soluções Ágeis), no qual trabalhei por um ano e meio como Coach.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Programação em Par (XP)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A programação em par é, a principio, a estratégia mais cara, pois com ela é preciso manter dois desenvolvedores trabalhando na mesma estória. Porém, dessa forma, o código recebe revisão em tempo real, cada desenvolvedor monitora o código que o outro está escrevendo, o tempo todo, de forma a identificar erros comuns de programação de forma imediata, e então minimizar o custo de correção dos mesmos.&lt;br /&gt;&lt;br /&gt;No final das contas a programação em par pode se tornar mais barata, já que irão "vazar" bem menos erros do que vazaria se uma pessoa estivesse programando sozinha, além disso o código fica mais legível já que será necessário a compreensão de duas pessoas e não de uma só.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pergunta&lt;/span&gt;: Bem, se o a programação em par traz tantos benefícios por não utilizá-la sempre ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resposta&lt;/span&gt;: Quando as diferenças no níveis de conhecimento dos programadores de uma equipe possuir uma grande amplitude. Trocando em miúdos, se você coloca um programdor Senior para trabalhar em par com um programador estagiário sem nenhuma experiência, há uma grande chance de o Senior fazer todo o trabalho e o estagiário ficar olhando, pois não conseguirá acompanhar o desenvolvimento do outro, que por motivos de prazo e ansiedade, nem sempre terá a paciência para explicar tudo o que o outro não compreender.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Revisão de Código (Scrum)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O Scrum sugere que o código de uma dada feature seja revisado por outros desenvolvedores antes que possa ser considerado como concluído.&lt;br /&gt;&lt;br /&gt;A princípio essa prática é mais barata pois só será necessário concentrar o trabalho de mais de um desenvolvedor em uma feature no momento da revisão de código, e esse momento é muito curto em relação a todo tempo necessário para a implementação da mesma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pergunta&lt;/span&gt;: &lt;span dir="ltr" id=":qa"&gt;Bem, se a revisão de código é barata, e no final o código será revisado por vários desenvolvedores&lt;wbr&gt;, por que não utilizá-la sempre ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resposta:&lt;/span&gt; Durante o desenvolvimento de uma feature existem pontos críticos nos quais o trabalho em par se mostra muito mais eficiente do que trabalhar sozinho, de forma que trabalhar sozinho todo tempo pode atrasar o desenvolvimento além de impedir que a qualidade do código seja melhor, caso fosse escrito por mais de uma pessoa.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Caso Real: O melhor dos dois mundos no projeto FPw Workflow (LG Sistemas)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Na equipe de desenvolvimento do projeto FPw Workflow adotamos a seguinte estratégia para lidar tanto com as vantagens da programação em par quanto da revisão de código, e consequentemente minimizar as desvantagens das mesmas. A estratégia é exemplificada com a lista abaixo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No início de qualquer feature o desenvolvimento deve ser em par, com o responsável pela feature e o coach da equipe, até que solução já tenha um esboço inicial palpável(esse ponto varia de acordo com a experiência do desenvolvedor);&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span dir="ltr" id=":pm"&gt;O desenvolvedor deve reconhecer pontos, durante o desenvolvimento&lt;wbr&gt;, de maior impacto no código e na arquitetura do sistema, e então solicitar o coach para escolherem a melhor estratégia;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;O restante do desenvolvimento o responsável realiza sozinho;&lt;/li&gt;&lt;li&gt;Quando o responsável der a feature por concluída, o coach faz a revisão de código e se necessário deve solicitar a participação de outra pessoa da equipe com mais experiência.&lt;/li&gt;&lt;/ul&gt;É isso, essa estratégia antendeu melhor nossas necessidades do que a adoção isolada da pogramação em par ou revisão de código, e só chegamos nessa fórmula tentando, errando e corrigindo, ou seja aplicando o processo auto-adaptativo.&lt;br /&gt;&lt;br /&gt;Espero ter contribuído!&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://www.lg.com.br/"&gt;http://www.lg.com.br/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fibonacci.inf.br/"&gt;http://fibonacci.inf.br/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://improveit.com.br/xp/praticas/programacao_par"&gt;http://improveit.com.br/xp/praticas/programacao_par&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-123566243668349843?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/123566243668349843/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=123566243668349843' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/123566243668349843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/123566243668349843'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/07/programacao-em-par-vs-revisao-de-codigo.html' title='Programação em Par vs Revisão de Código'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-6592731196306782521</id><published>2009-07-06T10:03:00.000-07:00</published><updated>2009-07-06T10:17:37.170-07:00</updated><title type='text'>ExpectedException para NUnit 2.5</title><content type='html'>Uma mudança na versão 2.5 do NUnit é a forma de se indicar que um dado código de teste deve levantar uma exceção.&lt;br /&gt;&lt;br /&gt;Nas versões anteriores  à versão 2.5 isso era feito atravéz do atributo &lt;span style="font-weight: bold;"&gt;[ExpectedException]&lt;/span&gt;, aplicado ao método que contem seu teste, como no exemplo abaixo:&lt;pre class="csharpcode"&gt;&lt;br /&gt;      [&lt;span style="color: rgb(51, 204, 255);"&gt;Test&lt;/span&gt;]&lt;br /&gt;      [&lt;span style="color: rgb(51, 204, 255);"&gt;ExpectedException&lt;/span&gt;(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(51, 204, 255);"&gt;NullReferenceException&lt;/span&gt;))]&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;void&lt;/span&gt; TesteAcessoObjetoNulo()&lt;br /&gt;      {&lt;br /&gt;              MeuObjeto obj = &lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;              obj.MeuMetodo();&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A partir da versão 2.5 o atributo &lt;span style="font-weight: bold;"&gt;[ExpectedException] &lt;/span&gt;&lt;span&gt;deve ser substituido pelo método estático &lt;span style="font-weight: bold;"&gt;Assert.Throws. &lt;/span&gt;Como no exemplo abaixo:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       [&lt;span style="color: rgb(51, 204, 255);"&gt;Test&lt;/span&gt;]       &lt;br /&gt;       &lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;public&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;void&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;TesteAcessoObjetoNulo()&lt;br /&gt;       {&lt;br /&gt;               MeuObjeto obj = &lt;span style="color: rgb(51, 51, 255);" class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;               Assert.Throws&lt;&lt;span style="color: rgb(51, 204, 255);"&gt;NullReferenceException&lt;/span&gt;&gt;(() =&gt; obj.MeuMetodo());&lt;br /&gt;       }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;É só isso, não tem mais nada, acabou, boa sorte... :-P&lt;br /&gt;&lt;br /&gt;Abraços&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-6592731196306782521?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/6592731196306782521/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=6592731196306782521' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/6592731196306782521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/6592731196306782521'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2009/07/expectedexception-para-nunit-25.html' title='ExpectedException para NUnit 2.5'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-4738079063604182588</id><published>2008-06-22T16:55:00.000-07:00</published><updated>2008-06-22T17:18:34.439-07:00</updated><title type='text'>Programação Assíncrona [Parte 2 - BackgroundWorker]</title><content type='html'>&lt;div style="text-align: justify;"&gt;Em .NET existe um componente que provê uma forma bastante simplificada de se realizar as diversas operações necessárias para se executar código de forma assíncrona: &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Exibir  o progresso da operação;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Obter  o resultado na thread que iniciou a execução  assíncrona;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Cancelar  a operação;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Monitorar  o estado da operação.   &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;Este componente é o &lt;b&gt;BackgroundWorker&lt;/b&gt;&lt;span style=""&gt;  &lt;span style="font-size:85%;"&gt;(System.ComponentModel.BackgroundWorkder).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: justify;"&gt;Para aplicações WindowsForms adicionar este componente é tão simles quanto realizar um &lt;i&gt;drag and drop &lt;/i&gt;&lt;span style="font-style: normal;"&gt;do mesmo na parte &lt;/span&gt;&lt;i&gt;Components&lt;/i&gt;&lt;span style="font-style: normal;"&gt; da &lt;/span&gt;&lt;i&gt;Toolbox&lt;/i&gt;&lt;span style="font-style: normal;"&gt; do Visual Studio, para as demais aplicações &lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: justify;"&gt;é necessário declarar e instanciar um objeto BackgroundWorker, o que é também um trabalho trivial.&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: justify;"&gt;Um vez que temos um BackgroundWorker em mãos vamos ao que nos interessa. Primeiramente vamos supor que o código que desejamos executar de forma assíncrona é o representado pelo método BaixeArquivos, abaixo:&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; BaixeArquivos(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[] urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; url &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;span style="font-size:85%;"&gt;BaixeArquivos(url, DiretorioDeDestino);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;}  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:85%;"&gt;Obs.: Considere também que BaixeArquivo é um método que realmente realiza o download de um dado arquivo, com base na url do mesmo, e que DiretorioDeDestino é uma constante da aplicação.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Para que este código seja executado via BackgroundWorker é necessário invoca-lo de dentro do evento DoWork:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span lang="zxx"&gt;BackgroundWorker&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; worker = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span lang="zxx"&gt;BackgroundWorker&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;(); &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span lang="zxx"&gt;// variável de instância&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;void &lt;/span&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;AlgumMetodo() &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.DoWork += (Worker_DoWork);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.RunWorkerAsync(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://solucoesageis.com.br/Portals/0/logoNFe.JPG"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.google.com.br/intl/pt-BR_br/images/logo.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.msdnbrasil.com.br/anp/img/tit_ranking_msdn.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;   &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; Worker_DoWork(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; sender, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span lang="zxx"&gt;DoWorkEventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;BaixeArquivos(e.Argument &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[]);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;O código acima já ilustra duas operações do componente em questão: a criação do método que irá executar de forma assíncrona(assinar o evento &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;i&gt;DoWork)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; e o disparo da operação (invocar o método &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;i&gt;RunWorkerAsync&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;). Note que os argumentos necessários para a execução da operação são passados atravéz do argumento do método RunWorkerAsync, que é do tipo &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;i&gt;object,&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; e depois deve ser convertido para o tipo apropriado dentro do código que executa a operação.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Neste ponto já sabemos criar um BackgroundWorker, assinar o seu evento principal fornecer os argumentos necessários, iniciar a operação, obter os argumentos(via DoWorkEventArgs.Argument) e realizar o trabalho necessário. Para situções mais simples isso já é o suficiente, porém se o caso for esse aconselho o uso de delegates, pois se trata do caso mais simples de execução assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Então o que mais pode ser necesário ??&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;b&gt;Relatar  Progresso:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;  para relatar progresso é necessário assinar o evento  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;i&gt;ProgressChanged&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;  e invocar o método &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;i&gt;ReportProgress.  &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt;Veja  a aplicação desta estratégia em nosso estudo de  caso:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; AlgumMetodo() &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.DoWork += (Worker_DoWork);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.ProgressChanged +=  (Worker_ProgressChanged);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.RunWorkerAsync(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://solucoesageis.com.br/Portals/0/logoNFe.JPG"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.google.com.br/intl/pt-BR_br/images/logo.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.msdnbrasil.com.br/anp/img/tit_ranking_msdn.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;    &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Worker_ProgressChanged(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; sender, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ProgressChangedEventArgs&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;.Write(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Operação "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; + e.ProgressPercentage + &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"% concluída."&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; BaixeArquivos(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[] urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; cont = 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; url &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;BaixeArquivos(url, DiretorioDeDestino);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="font-size:85%;"&gt;worker.ReportProgress((++cont)/urls.Length);&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;Veja que o método que relata o progresso é o que assina o evento &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;ProgressChanged &lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;e que o método &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;ReportProgess&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt; deve ser invocado de dentro do código que é executado assíncronamente, pois este deve saber em qual porcentagem de conclusão ele se encontra.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;Outro detalhe é a propriedade &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;WorkerReportsProgress &lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;que indica se o componente irá invocar o evento &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;ProgressChanged&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt; quando o método &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;ReportProgress&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt; for chamado, o valor dessa propriedade é &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;true&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt; por &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;default&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;Pronto agora já sabemos como relatar progresso, o controle &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;ProgressBa&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;r poderia ser usado no lugar da escrita no Console para aplicações &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;WindowsForms&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;. Então vamos à próxima necessidade:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;  &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;Cancelar  a operação: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;para  cancelar uma operação que foi iniciada por um  BackgroundWorker é necessário invocar o método  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;CancelAsync&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  que irá disparar o evento &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;RunWorkerCompleted&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;.  Quando este método é invocado o propriedade  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;CancellationPending  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;é  configurada com &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;true,  &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;e  então o valor dessa variável deve ser verificado  dentro do método que assina o evento &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;DoWork&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  para que neste a lógica de cancelamento seja executada. Assim  como no relatório de progresso você tem a opção  de desabilitar o cancelamento da operação atravéz  da porpriedade &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;WorkerSuportsCancellation&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;,  que é &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;true&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  por &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;default&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;.  Veja a ilustração de um cancelameno abaixo:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; AlgumMetodo() &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.DoWork += (Worker_DoWork);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.ProgressChanged +=  (Worker_ProgressChanged);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.RunWorkerCompleted += (Worker_RunWorkerCompleted);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.RunWorkerAsync(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://solucoesageis.com.br/Portals/0/logoNFe.JPG"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.google.com.br/intl/pt-BR_br/images/logo.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"http://www.msdnbrasil.com.br/anp/img/tit_ranking_msdn.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;    &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;//codigo qualquer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; font-style: normal; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang=""&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span lang=""&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang=""&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span lang=""&gt; VerificaSeEhNecessarioCancelar()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;// Verificou-se que é necessário cancelar&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;worker.CancelAsync();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; font-style: normal; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; Worker_RunWorkerCompleted(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; sender, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;RunWorkerCompletedEventArgs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (e.Cancelled)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Operação cancelada"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;);            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt; &lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; BaixeArquivos(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[] urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; cont = 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; url &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;     if&lt;/span&gt; (&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang=""&gt;worker.CancellationPending&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="font-size:85%;"&gt;  // Possível lógica de cancelamento deve estar aqui&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;e.Cancel = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;              &lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;     BaixeArquivos(url, DiretorioDeDestino);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="font-size:85%;"&gt;worker.ReportProgress((++cont)/urls.Length);&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Observe que a lógica de cancelamento deve ser inserida no código que está sendo executado de forma assíncrona. Além disso note que evento para este caso é o evento de conclusão da operação, isto é, ele será invocado não só apenas quando houver cancelamento da operação, e sim sempre que esta for conlcuída, independentemente do resultado. Com base nisto vamos para o próximo requisito:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;  &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;Obter  o resultado da operação: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;como  você já sabe assinar o evento que será disparado  no momento de conclusão da operação resta  apenas um detalhe: indicar o resultado, isto é  feito atravéz  da propriedade &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;DoWorkEventArgs.Result&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;.  Como a propriedade &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;Resul&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;t  só pode ser obtida de dentro do método que assina o  evento &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;DoWork&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  teremos que migrar o código do método BaixeArquivos  para dentro do método Workder_DoWork (claro que existem  outras formas de se fazer isto, mas vamos simplificar). Vamos ao  código:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; Worker_RunWorkerCompleted(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; sender, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;RunWorkerCompletedEventArgs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (e.Cancelled)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Operação cancelada"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Resultado: "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; + e.Result);   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; Worker_DoWork(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span lang="zxx"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; sender, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span lang="zxx"&gt;DoWorkEventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span lang="zxx"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; urls = e.Argument &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;[];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; cont = 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; url &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; urls)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;     if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (&lt;/span&gt;&lt;span lang=""&gt;worker.CancellationPending&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                  &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span lang=""&gt;// Possível lógica de cancelamento deve estar aqui&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;e.Cancel = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;              &lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;     BaixeArquivos(url, DiretorioDeDestino);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="font-size:85%;"&gt;worker.ReportProgress((++cont)/urls.Length);&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;e.Result = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Downalods Realizados"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; font-style: normal; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;A propriedade &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;Result&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; é do tipo &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;i&gt;&lt;span style=""&gt;Object&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;, o que permite que qualquer tipo de resultado seja retornado atravéz dela.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;A última manipulação que será explicada é a consulta do status de uma operação assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;  &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Requisitando o &lt;/b&gt;&lt;i&gt;&lt;b&gt;status&lt;/b&gt;&lt;/i&gt;&lt;b&gt;  de uma operação:  &lt;/b&gt;Em algum momento de seu código  pode ser necessário saber se a operação está  acontecendo, ou se ela já está concluída (pois  nem sempre o resultado da mesma será retornado), resumindo,  pode ser necessário saber se o componente BackgroundWorker  está trabalhando ou se ele está livre. Exemplo: para  poder iniciar uma nova operação, no caso desta  operação não poder ser executada mais de uma  vez ao mesmo tempo. Para saber isso é preciso consultar a  propriedade &lt;i&gt;IsBusy&lt;/i&gt; do BackgroundWorker.  Código:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal; text-align: left;" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; TenteLancarOperacao()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; (!worker.IsBusy)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;span style="font-size:85%;"&gt;worker.RunWorkerAsync(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;"http://solucoesageis.com.br/Portals/0/logoNFe.JPG"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;"http://www.google.com.br/intl/pt-BR_br/images/logo.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                        &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;"http://www.msdnbrasil.com.br/anp/img/tit_ranking_msdn.gif"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;span style="font-size:85%;"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;  &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; &lt;/div&gt;&lt;p class="western" style="margin-bottom: 0cm; text-align: left;" lang=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Espero que neste ponto você considere um novo componente para sua caixa de ferramentas de programação. Existem mil formas de se fazer a mesma coisa, e tudo indica que devemos dar preferência para o caminho mais curto e o BackgroundWorker é um caminho curto para operações assíncronas onde é necessário um acompanhamento minucioso do processo, pois neste a parte burocrática já está pronta, basta inserir o código certo no local certo. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal;" align="justify" lang="zxx"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Até o próximo post!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-4738079063604182588?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/4738079063604182588/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=4738079063604182588' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4738079063604182588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4738079063604182588'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/06/programao-assncrona-parte-2.html' title='Programação Assíncrona [Parte 2 - BackgroundWorker]'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-4415873053764049394</id><published>2008-05-29T18:23:00.000-07:00</published><updated>2008-12-10T01:39:20.602-08:00</updated><title type='text'>Executando métodos de forma assíncrona [Parte1 - Delegates]</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_AGzecjLaMYE/SD9YeKZsLrI/AAAAAAAAAAg/A--z9UDvHjk/s1600-h/quad_core_illustration_thumb.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_AGzecjLaMYE/SD9YeKZsLrI/AAAAAAAAAAg/A--z9UDvHjk/s320/quad_core_illustration_thumb.jpg" alt="" id="BLOGGER_PHOTO_ID_5205976969475010226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Programação assíncrona é um assunto bastante completo e complexo. Um dos motivos para ser assim é que existem diversas formas para se executar código assincronamente, isto é, em uma thread separada. As principais estratégias são:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:100%;"&gt;Usar a classe Thread;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:100%;"&gt;Usar o componente BackgroundWorker;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt;  &lt;span style="font-size:100%;"&gt;Usar delegates;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;   &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;Neste artigo vou falar da forma mais rápida de se executar um trecho de código em um thread separada e dedicada: através de delegates.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;Existem três estratégias para executar código em uma thread dedicada, são eles:&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Chame o método  assíncronamente, faça alguma coisa e finalize a  chamada assíncrona (a thread fica bloqueada até a o  término da operação)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Chame o método   assíncronamente, e enquanto a execução não  terminar faça alguma coisa, e então finalize a chamada  assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Chame o método  assínconamente, defina um CallBack para ser invocado no final  da operação assíncorna, na implementação  do CallBack finalize a chamada assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;A primeira coisa  a se fazer é criar um delegate com a mesma assinatura do método que contém o código que se deseja executar assincronamente. Veja o exemplo:&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;Método:&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; BuscaDocumento(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; autor, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; posicao)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; caminho = &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;.Empty;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;// faz alguma coisa&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; caminho;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Delegate:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;delegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; autor, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; posicao)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Neste ponto já podemos realizar duas das estratégias de programação assíncrona usando delegates:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li value="1"&gt;&lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Chame o método  assíncronamente, faça alguma coisa e finalize a  chamada assíncrona (a thread fica bloqueada até a o  término da operação)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0cm;" align="justify" lang="zxx"&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Chame o método   assíncronamente, e enquanto a execução não  terminar faça alguma coisa, e então finalize a chamada  assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Vamos aos usos:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Caso 01: Chame o método assíncronamente, faça alguma coisa e finalize a chamada assíncrona (a thread fica bloqueada até a o término da operação)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#2b91af;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="zxx"&gt;&lt;span style=""&gt; buscaDel = BuscaDocumento;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;IAsyncResult&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; result = buscaDel.BeginInvoke(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Erico Veríssimo"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;, 25, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;//faça alguma coisa outra coisa&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; resultado = buscaDel.EndInvoke(result);  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;/* a thread bloqueia nesse ponto até que a operação BuscaDocumento seja concluida */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;obs:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Os dois parâmetros nulos na chamada do método BeginInvoke são CallBack e State, respectivamente. Estes são necessários apenas para a terceira estratégia, a qual será demonstrada ainda neste artigo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Caso 02: Chame o método  assíncronamente, e enquanto a execução não terminar faça alguma coisa, e então finalize a chamada assíncrona.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="western" style="margin-bottom: 0cm;"&gt; &lt;span style="color:#2b91af;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; buscaDel = BuscaDocumento;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;IAsyncResult&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; result = buscaDel.BeginInvoke(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;"Erico Veríssimo"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;, 25, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt; &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;while&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; (!result.IsCompleted)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#000000;"&gt; &lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;     &lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;//faça qualquer coisa&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt;&lt;span style="color:#000000;"&gt; &lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="zxx"&gt; resultado = buscaDel.EndInvoke(result);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;A vantagem desta implementação em relação às demais é que a thread principal não ficará bloqueada enquanto a thread em backgound não for concluída, o que permite que trechos de código sejam executados até a finalização da operação inciada via delegate.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;A terceira forma é através de CallBacks, esta exige a implementação de outro método e será explicada a seguir.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Além do método com o código e do delegate equivalente é necessário um método de CallBack, que será invocado quando a operação assíncrona for concluída. O CallBack deve retornar &lt;b&gt;void &lt;/b&gt;e receber um IasyncResult como argumento.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Método de CallBack:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; BuscaDocumentoCallBack(&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;IAsyncResult&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; resultado)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang=""&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; buscaDel = (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;) resultado.AsyncState ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; resultadoDaBusca = buscaDel.EndInvoke(resultado);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;"Resultado da Busca: {0}"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;, resultadoDaBusca);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang=""&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Usando o delegate:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;BuscaDocumentoDelegate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt; buscaDel = BuscaDocumento;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;p class="western" style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;buscaDel.BeginInvoke(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;"Arnaldo Jabor"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang=""&gt;, 34, BuscaDocumentoCallBack, buscaDel);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang=""&gt;&lt;span style="color:#008000;"&gt;&lt;span style="font-size:85%;"&gt;/* O fluxo desta thread continua, de modo que outras operações podem ser realizadas enquanto a operação em background prossegue, e quando esta finalizar o método BuscaDocumentoCallBack será invocado. */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Como podem ver não tem segredo. Essas técnicas são muito úteis em programas Windows Forms, pois nestes geralmente o usuário precisa de executar várias operações ao mesmo tempo, e além disso também são útis para processamentos longos que não necessitam de retorno imediato.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Em breve volto com Threads e BackgroundWorker!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Abraços,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm;" lang="zxx"&gt; &lt;span style="color:#000000;"&gt;&lt;span style="font-size:100%;"&gt;Até&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-4415873053764049394?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/4415873053764049394/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=4415873053764049394' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4415873053764049394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/4415873053764049394'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/05/executando-mtodos-de-forma-assncrona.html' title='Executando métodos de forma assíncrona [Parte1 - Delegates]'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_AGzecjLaMYE/SD9YeKZsLrI/AAAAAAAAAAg/A--z9UDvHjk/s72-c/quad_core_illustration_thumb.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-5036736533335570283</id><published>2008-05-16T09:15:00.000-07:00</published><updated>2008-05-16T09:28:11.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Biblioteca de Expressões Regulares[Regex Library]</title><content type='html'>&lt;a href="http://fredpolicarpo.files.wordpress.com/2008/05/regexbuddy.gif"&gt;&lt;img class="aligncenter size-medium wp-image-31" src="http://fredpolicarpo.wordpress.com/files/2008/05/regexbuddy.gif?w=300" alt="Trabalhando com Expressões Regulares" height="291" width="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Os modelos de programação modernos tem se preocupado principalmente com princípios de alto-nível como robustez, flexibilidade, boa arquitetura e um projeto composto de módulos com baixo acoplamento e alta coesão. E eu estou de total acordo com eles, são esses princípios que sustentam grandes softwares, principalmente aqueles que necessitam de constante alteração (isto é, 99%* deles :-))&lt;br /&gt;&lt;br /&gt;Porém existem cenários em que habilidades que antes eram extremamente comuns para os programadores vôvôs, de sistemas Unix e tal, e que para nós, engenheiros de software, não são tão intuitivas, se tornam a chave para uma boa solução. Um exemplo disso são as &lt;strong&gt;Expressões Regulares&lt;/strong&gt;, cujo cenário em que dominam é o &lt;strong&gt;reconhecimento de padrões&lt;/strong&gt; em textos.&lt;br /&gt;&lt;br /&gt;Por exemplo: Como fazer para verificar se uma string é uma data válida ? As duas opções que vejo são:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;br /&gt;&lt;li&gt;Um código cheio de IFs e extremamente confuso&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Um expressão regular, não menos confusa que a opção anterior :-p&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A grande vantagem da expressão regular é o desempenho, as bibliotecas que processam essas expressões são altamente eficientes, a classe &lt;strong&gt;Regex &lt;/strong&gt;de .NET, por exemplo.&lt;br /&gt;&lt;br /&gt;A grande dificuldade de expressões regulares é complexidade, veja por exemplo a &lt;strong&gt;expressão regular para&lt;/strong&gt; &lt;strong&gt;validar data&lt;/strong&gt; no formato &lt;strong&gt;dd/mm/aaaa:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;(((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|&lt;br /&gt;(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|&lt;br /&gt;((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|&lt;br /&gt;((29)(\.|-|\/)(02)([/])([02468][048]00))|&lt;br /&gt;((29)([/])(02)([/])([13579][26]00))|((29)([/])(02)([/])([0-9][0-9][0][48]))|&lt;br /&gt;((29)([/])(02)([/])([0-9][0-9][2468][048]))|&lt;br /&gt;((29)([/])(02)([/])([0-9][0-9][13579][26])))&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Simples né ??&lt;br /&gt;&lt;br /&gt;Mas o interessante é que encontrei um site com centenas dessas expressões malucas: &lt;a href="http://regexlib.com/" target="_blank"&gt;http://regexlib.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com essa ferramenta (o site) você pode facilitar a grande dor de cabeça das expressões regulares, isto é, a confecção das mesmas, e então aproveitar do que elas tem de melhor: &lt;strong&gt;Eficiência&lt;/strong&gt;!&lt;br /&gt;&lt;br /&gt;Dica &lt;strong&gt;.NET&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para fazer a validação de data (&lt;span style="font-weight: bold;"&gt;dd/mm/aaaa&lt;/span&gt;) em .NET (C#) use o seguinte código:&lt;br /&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt; regex(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;&lt;span&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt; data)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;{ &lt;/span&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;&lt;span&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt; expressao = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;&lt;span&gt;@"(((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;  (([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;  ((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\.|-|\/)(02)([/])([02468][048]00))|&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;  ((29)([/])(02)([/])([13579][26]00))|&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;  ((29)([/])(02)([/])([0-9][0-9][0][48]))|&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt;  ((29)([/])(02)([/])([0-9][0-9][2468][048]))|&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:100%;" &gt; &lt;span&gt; ((29)([/])(02)([/])([0-9][0-9][13579][26])))"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:100%;" &gt;&lt;span&gt; return&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);font-size:100%;" &gt;&lt;span&gt;Regex&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span&gt;.IsMatch(data, expressao);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt; &lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: justify;"&gt;O recado é esse, se precisar de Expressões Regulares, prontinhas e esperando para serem usadas, acesse:&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class="western" style="margin-bottom: 0pt; text-align: justify;"&gt;&lt;a href="http://regexlib.com/" target="_blank"&gt;&lt;img class="alignnone size-medium wp-image-32" src="http://fredpolicarpo.wordpress.com/files/2008/05/site.png?w=296" alt="" height="53" width="296" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;* Esses 99% foi um número inventado por mim mesmo, mas caso você pesquise verá que realmente se trata da grande maioria.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-5036736533335570283?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/5036736533335570283/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=5036736533335570283' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/5036736533335570283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/5036736533335570283'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/05/os-modelos-de-programao-modernos-tem-se.html' title='Biblioteca de Expressões Regulares[Regex Library]'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-3854407385820250518</id><published>2008-05-16T09:06:00.000-07:00</published><updated>2008-05-16T09:13:21.506-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Coleções Case-Insensitive [Parte 02 - Busca em ArrayList]</title><content type='html'>&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;Neste artigo vou falar um pouco de como trabalhar com Case-Insensitive em Listas, como havia combinado no &lt;a href="http://fredpolicarpo.blogspot.com/2008/05/certa-vez-me-deparei-com-o-problema-de.html"&gt;artigo anterior&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:small;"&gt;Antes de falar de lista gostaria de falar de um tipo de &lt;span style="color: rgb(0, 128, 128);"&gt;Hashtable&lt;/span&gt; (eu sei que &lt;span style="color: rgb(0, 128, 128);"&gt;Hashtable&lt;/span&gt; foi assunto do outro post, porém existe uma armadilha do .NET :-) )&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:small;"&gt;Conforme apresentei anteriormente, a classe usada para criar &lt;span style="color: rgb(0, 128, 128);"&gt;Hashtable&lt;/span&gt; Case-Insensitive é &lt;span style="color: rgb(0, 128, 128);"&gt;CollectionsUtil&lt;/span&gt;, com o método &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;CollectionsUtil&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;strong&gt;.CreateCaseInsensitiveHashtable()&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;br /&gt;&lt;br /&gt;O outro método utilitário desta classe é &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;CollectionsUtil&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;strong&gt;.CreateCaseInsensitiveSortedList()&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;. Então ele é o usado para lista case insensitive ?? Não, ele é usado para criar um &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;SortedList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; que na verdade é um &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;Hashtable &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;e que ordena as entradas pelo valor das chaves :S Estranho, não!? Esse nome realmente não é sugestivo, pois não se trata de uma lista ordenada, mas &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;SortedList &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;é assunto para outro post, vamos ao que interessa!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;Pra começar é interessante notar que Case-Insensitive é um problema natural de dicionários, e não de listas, e deve ser por isso que não existe um lista nativa em .NET que seja Case-Insensitive.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Então por que estou escrevendo este post ? Pra mostar uma forma de se fazer busca Case-Insensitive em um &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0pt;" align="center" lang="pt-BR"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" align="center" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Busca Case-Insensitive em &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList.&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;Isto é, buscar uma string em uma lista sem considerar o case.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Vamos criar um método estático que recebe um &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, um string para ser buscada e então retorna true se a string existir e false se não existir, considerando a comparação Case-Insensitive:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;/p&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";font-size:100%;" &gt;&lt;span style=";color:#0000ff;" &gt;public&lt;/span&gt;&lt;span style=";color:#000000;" &gt; &lt;/span&gt;&lt;span style=";color:#0000ff;" &gt;static&lt;/span&gt;&lt;span style=";color:#000000;" &gt; &lt;/span&gt;&lt;span style=";color:#0000ff;" &gt;bool&lt;/span&gt;&lt;span style=";color:#000000;" &gt; ContemValor(&lt;/span&gt;&lt;span style=";color:#0000ff;" &gt;string&lt;/span&gt;&lt;span style=";color:#000000;" &gt; valor, &lt;/span&gt;&lt;span style=";color:#008080;" &gt;ArrayList&lt;/span&gt;&lt;span style=";color:#000000;" &gt; lista)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";color:#000000;" &gt;&lt;span style=";font-size:100%;" &gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";font-size:100%;" &gt;&lt;span style=";color:#008080;" &gt; ArrayList&lt;/span&gt;&lt;span style=";color:#000000;" &gt; aux = &lt;/span&gt;&lt;span style=";color:#0000ff;" &gt;new&lt;/span&gt;&lt;span style=";color:#000000;" &gt; &lt;/span&gt;&lt;span style=";color:#008080;" &gt;ArrayList&lt;/span&gt;&lt;span style=";color:#000000;" &gt;(lista);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";color:#000000;" &gt;&lt;span style=";font-size:100%;" &gt; aux.Sort();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";font-size:100%;" &gt;&lt;span style=";color:#0000ff;" &gt; return&lt;/span&gt;&lt;span style=";color:#000000;" &gt; (aux.BinarySearch(valor, &lt;/span&gt;&lt;span style=";color:#008080;" &gt;StringComparer&lt;/span&gt;&lt;span style=";color:#000000;" &gt;.InvariantCultureIgnoreCase) &gt;= 0);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt;" mce_style="margin-bottom:0;" align="justify" lang="pt-BR"&gt;&lt;span style=";color:#000000;" &gt;&lt;span style=";font-size:100%;" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Outra opção é estender a classe &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; e sobrescrever o método Contains, segue a implmentacão:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;/p&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ListaCaseInsensitive&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; : &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" lang="pt-BR"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;bool&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Contains(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;object&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; item)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt; ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; aux = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(lista);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;aux.Sort();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (aux.BinarySearch(valor, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;StringComparer&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.InvariantCultureIgnoreCase) ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt;" lang="pt-BR"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt;" align="justify" lang="pt-BR"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;Para a inserção essa operação não faz sentido pois se fossémos verificar se um valor, case-insensitive ou não, existe em uma lista antes de inserí-lo na mesma essa lista passaria a ser um tipo de Conjunto, o qual, diferentemente de uma lista, não possui elementos repetidos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;É isso, como podem ver a implementação é bastante enxuta, porém pode causar dúvidas por não ser uma operação nativa de &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ArrayList&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ou qualquer outro tipo de lista em .NET 2.0. Essa foi a melhor forma que encontrei de satisfazer esse requisito, caso conheça alguma outra compartilhe conosco!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0pt; text-align: justify;" lang="pt-BR"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:small;"&gt;Espero ter colaborado, se esse assunto te interessou faça um comentário!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-3854407385820250518?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/3854407385820250518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=3854407385820250518' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/3854407385820250518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/3854407385820250518'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/05/colees-case-insensitive-parte-02-busca.html' title='Coleções Case-Insensitive [Parte 02 - Busca em ArrayList]'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-7403104064489307871</id><published>2008-05-16T09:04:00.000-07:00</published><updated>2008-06-26T12:47:21.946-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certificação'/><category scheme='http://www.blogger.com/atom/ns#' term='MCTS'/><category scheme='http://www.blogger.com/atom/ns#' term='Goiânia'/><category scheme='http://www.blogger.com/atom/ns#' term='Profissional'/><category scheme='http://www.blogger.com/atom/ns#' term='Certificado'/><category scheme='http://www.blogger.com/atom/ns#' term='MCP'/><title type='text'>MCTS: .NET Framework 2.0 Windows Applications</title><content type='html'>&lt;div class="Section1" style="text-align: center;"&gt;&lt;a href="http://fredpolicarpo.files.wordpress.com/2008/05/mcts1.gif"&gt;&lt;img class="size-medium wp-image-25 aligncenter" src="http://fredpolicarpo.wordpress.com/files/2008/05/mcts1.gif?w=300" alt="" height="223" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="Section1" style="text-align: justify;"&gt;&lt;strong&gt;Boas Novas!&lt;/strong&gt; Após árduos sete meses de estudo  consegui alcançar a certificação &lt;strong&gt;MCTS&lt;span class="GramE"&gt;: .&lt;/span&gt;NET &lt;span class="SpellE"&gt;Framework&lt;/span&gt; 2.0 Windows &lt;span class="SpellE"&gt;Applications&lt;/span&gt;&lt;/strong&gt;. &lt;span class="SpellE"&gt;&lt;span&gt;Isso&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;span class="SpellE"&gt;significa&lt;/span&gt; ser &lt;span class="SpellE"&gt;aprovado&lt;/span&gt; &lt;span class="SpellE"&gt;nos&lt;/span&gt; &lt;span class="SpellE"&gt;seguintes&lt;/span&gt; &lt;span class="SpellE"&gt;exames&lt;/span&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="Section1"&gt;&lt;ul style="margin-top: 0pt;" type="disc"&gt;&lt;li class="MsoNormal"&gt;&lt;span&gt;(70-536) TS: Microsoft .NET  Framework 2.0 – Application Development Foundation&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li class="MsoNormal"&gt;&lt;span&gt;(70-526) TS: Microsoft .NET  Framework 2.0 – Windows-Based Client Development.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="Section1" style="text-align: justify;"&gt;Não posso deixar de agradecer o apoio da empresa na qual trabalho: &lt;a title="Fibonacci - Soluções Ágeis" href="http://solucoesageis.com.br/" target="_blank"&gt;Fibonacci Soluções Ágeis&lt;/a&gt;. Sem dúvidas este apoio foi de extrema importância para que eu conseguisse alcançar essa conquista. Valeu Fibo!&lt;/div&gt;&lt;br /&gt;É muito bom saber que existe mais um profissional MCTS em Goiânia, e além disso o conhecimento adquirido durante  esse período de treinamento (estudei sozinho, mas não deixa de ser um  treinamento) é de extrema importância para a qualidade do meu trabalho, tanto no  software que desenvolvo quanto para os artigos que escrevo neste &lt;span class="SpellE"&gt;blog&lt;/span&gt; e também para as futuras consultorias que &lt;span class="GramE"&gt;ministrarei,&lt;/span&gt; &lt;span&gt; &lt;/span&gt;ás quais  estão em estágio de planejamento.&lt;br /&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;Ainda essa semana será &lt;span class="GramE"&gt;postado&lt;/span&gt; a continuação do artigo sobre coleções  customizadas.&lt;/p&gt;Até breve.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-7403104064489307871?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/7403104064489307871/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=7403104064489307871' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/7403104064489307871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/7403104064489307871'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/05/mcts-net-framework-20-windows.html' title='MCTS: .NET Framework 2.0 Windows Applications'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6626108615401234991.post-1874500326096133</id><published>2008-05-16T07:56:00.000-07:00</published><updated>2008-05-16T09:14:38.363-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Artigos'/><title type='text'>Coleções Case-Insensitive [Parte 01 - Dicionários]</title><content type='html'>&lt;p class="western" align="justify" lang="pt-PT"&gt;&lt;img class="aligncenter" src="http://fredpolicarpo.wordpress.com/files/2008/04/duvida.jpg" alt="Como usar dicionários Case-Insensitive" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" align="justify" lang="pt-PT"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="western" align="justify" lang="pt-PT"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Certa vez me deparei com o problema de criar dicionários onde as chaves fossem &lt;strong&gt;Case-Insensitive&lt;/strong&gt;, isto é, dicionários onde a chave "nda" fosse considerada a mesma chave "NdA".&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" align="justify"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Existem diversos cenários onde este comportamento &lt;span&gt;é&lt;/span&gt; desejável. Imagine, por exemplo, um dicionário que contém o mapeamento &lt;strong&gt;nomeDoCampo&lt;/strong&gt; para &lt;strong&gt;ObjetoCampo&lt;/strong&gt;, que é usado para representar todos o campos de um objeto formulário.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" align="justify"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Se nas regras de negócio o nome do campo for Case-Sensitive, isto é, o campo nomeado "Campo01" for considerado diferente do campo nomeado "CAMPO01", não existe segredo, basta usar um Hashtable ou um Dictionary genérico que o problema estará sanado.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" align="justify"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Se, pelo contrário, as regras definirem que os nomes de campo "campo01" e "CAMPO01" devem se tratar do mesmo objeto, então seu dicionário, o qual irá conter esse mapeamento, precisa de um comportamento diferenciado.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Vamos ver como seria o trabalho de verificar se um dado campo, supondo que no nome do campo seja case-insensitive, está presente em um dicionário normal, juntamente com a operação de adição de um novo campo.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="western" style="background: rgb(255, 255, 153) none repeat scroll 0pt 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:small;"&gt;&lt;br /&gt;static Hashtable campos = new Hashtable();&lt;br /&gt;static void insiraCampo(string nome, object campo)&lt;br /&gt;{&lt;br /&gt;if (!campoExiste(nome))&lt;br /&gt;campos.Add(nome, campo);&lt;br /&gt;}&lt;br /&gt;static bool campoExiste(string nomeDoCampo)&lt;br /&gt;{&lt;br /&gt;foreach (DictionaryEntry entrada in campos)&lt;br /&gt;{&lt;br /&gt;if (entrada.Key.ToString().ToUpper().Equals(nomeDoCampo.ToUpper()))&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;return false;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Veja o mesmo exemplo onde a variável campos é um dicionário Case-Insensitive&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western" style="background: rgb(255, 255, 153) none repeat scroll 0pt 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; page-break-before: auto;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:small;"&gt;static Hashtable camposInsensitive = CollectionsUtil.CreateCaseInsensitiveHashtable();&lt;br /&gt;static void insiraCampoCaseInsensitive(string nome, object campo)&lt;br /&gt;{&lt;br /&gt;if (!campos.ContainsKey(nome))&lt;br /&gt;campos.Add(nome, campo);&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;O método campoExiste(string nomeDoCampo) não é mais necessário, basta invocar campos.ContainsKey(nomeDoCampo) para obter o resultado.&lt;br /&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;O ganho não é apenas na menor quantidade de linhas de código e de um melhor aproveitamento da API .NET, uma das principais vantagens é também o desempenho.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Vejam abaixo as diferenças entre os tempos de inserção usando as duas formas:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;table border="1" cellpadding="4" cellspacing="0" width="100%"&gt;&lt;col width="27*"&gt; &lt;col width="97*"&gt; &lt;col width="30*"&gt; &lt;col width="26*"&gt; &lt;col width="39*"&gt; &lt;col width="36*"&gt; &lt;tbody&gt; &lt;tr valign="top"&gt; &lt;td colspan="2" width="48%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Quantidade    de Itens Inseridos&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="12%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="10%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="15%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;5000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="14%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;10000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr valign="top"&gt; &lt;td width="10%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Tempo&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="38%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Hashtable    normal (ms)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="12%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;156250 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="10%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;650000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="15%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;196093750 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="14%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;930468750&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr valign="top"&gt; &lt;td width="10%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Tempo &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="38%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Hashtable    Case-Insensitive(ms) &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="12%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="10%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="15%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td width="14%"&gt; &lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;312500&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Baixe o código de testes &lt;a title="Código Fonte do Teste" href="http://estudosdotnet.googlecode.com/files/TestesDicionarioCaseInsensitive.zip"&gt;clicando aqui&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Configurações da máquina de Testes:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;1.75  GB de Memória RAM&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Processador  AMD Athlon 64 x2 - Dual Core Processor TK-53&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="western" style="background: rgb(255, 255, 153) none repeat scroll 0pt 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:small;"&gt;&lt;br /&gt;// Forma padrão de se criar um Hashtable Case Insensitive&lt;br /&gt;Hashtable insensitive = &lt;strong&gt;CollectionsUtil.CreateCaseInsensitiveHashtable()&lt;/strong&gt;;&lt;br /&gt;/*&lt;br /&gt;Criação de um Hashtable Case Insensitive informando o número máximo de  entradas que o objeto suporta.&lt;br /&gt;*/&lt;br /&gt;Hashtable insensitive2 = &lt;strong&gt;CollectionsUtil.CreateCaseInsensitiveHashtable(1000)&lt;/strong&gt;;&lt;br /&gt;/*&lt;br /&gt;Criação de um Hashtable Case Insensitive baseado em um Dicionário existente&lt;br /&gt;o dicionário recebido com argumento é não-genérico, mas caso deseje realizar essa operação com um dicionário genérico basta fazer o cast que funcionará corretamente.&lt;br /&gt;*/&lt;br /&gt;IDictionary&amp;lt;object, string&amp;gt; dicionario = new Dictionary&amp;lt;object, string&amp;gt;();&lt;br /&gt;dicionario.Add("chave01", "Qualquer coisa");&lt;br /&gt;dicionario.Add("Chave01", "Outra Coisa");&lt;br /&gt;dicionario.Add("chave02", "Qualquer coisa denovo");&lt;br /&gt;dicionario.Add("Chave02", "Mais uma coisa");&lt;br /&gt;// Dispara um ArgumentException&lt;br /&gt;Hashtable insensitive3 = &lt;strong&gt;CollectionsUtil.CreateCaseInsensitiveHashtable(dicionario as IDictionary)&lt;/strong&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;No próximo post irei falar um pouco sobre a manipulação Case-Insensitive de outros tipos de Coleções.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Espero ter contribuído, e fiquem a vontade para comentar e questionar sobre este &lt;span&gt;post&lt;/span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:small;"&gt;Abraços&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="western" style="margin-bottom: 0pt;"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6626108615401234991-1874500326096133?l=fredpolicarpo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fredpolicarpo.blogspot.com/feeds/1874500326096133/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6626108615401234991&amp;postID=1874500326096133' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1874500326096133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6626108615401234991/posts/default/1874500326096133'/><link rel='alternate' type='text/html' href='http://fredpolicarpo.blogspot.com/2008/05/certa-vez-me-deparei-com-o-problema-de.html' title='Coleções Case-Insensitive [Parte 01 - Dicionários]'/><author><name>Frederico Policarpo Martins</name><uri>http://www.blogger.com/profile/08089092155385559359</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_AGzecjLaMYE/SC23Mj-tGhI/AAAAAAAAAAY/FIAzVXcVXr8/S220/FRED.JPG'/></author><thr:total>0</thr:total></entry></feed>
