tag:blogger.com,1999:blog-839143801633925722024-02-19T17:32:32.675-08:00Roniz.Net em PortuguêsEste blog foi criado para divulgar informações úteis para os profissionais do Brasil.O foco é arquitetura de infraestrutura nas áreas de WCF , P2P , WPF e .Net em geral.
E sobre meus erros em português… vejam meu perfil e entenderás a razão :)
Todas as informações são fornecidas "como apresentada" sem garantias ou cessão de quaisquer direitos.Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-83914380163392572.post-29646252432146521172011-03-07T21:37:00.000-08:002011-03-07T21:37:31.070-08:00Dica de desempenho em WPF TreeView<div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">Eu tive problema quando usei costume TreeView com costume TreeViewItem.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">Quando o data binding executou, o Tree criou todos os itens no mesmo tempo – o que causou o CPU alto, muita memória , e a tela que teve o TreeView não estava respondendo por alguns segundos.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">No fim da minha pesquisa eu achei que:</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">O VS 2010 profiler não ajudou e não achou a razão do problema, ele apontou para MeasureOverride método do que a razão verdadeira que foi que eu deletei um trigger no xaml style do custom TreeViewItem - e isso não deixou a virtualização do TreeView funcionar normal.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">A falta de virtualização forçou o Tree criar todos os TreeViewItems quando o data binding para o ItemsSource mudou.</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><br />
</div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">Reparação:</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">No xaml que contém a declaração do TreeViewItem (ou class que herdar ele):</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">Na linha que começa assim :</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span style="font-family: Times New Roman;"><Style TargetType="{x:Type TreeViewItem}"></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: inherit;">dentro do triggers que começa assim:</span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="mso-ansi-language: pt-br;"><span style="font-family: Times New Roman;"><ControlTemplate.Triggers></span></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="font-family: inherit; mso-ansi-language: pt-br;">as seguintes linhas não podem remover, ou, podem usar outro multi trigger que causa o mesmo resultado:</span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span style="font-family: "Courier New"; font-size: 10pt;"><Trigger Property="IsExpanded" Value="false"></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span style="font-family: "Courier New"; font-size: 10pt;"> <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/></span></div><div class="MsoNormal" style="margin: 0in 0in 5.75pt; mso-margin-top-alt: auto;"><span lang="PT-BR" style="font-family: "Courier New"; font-size: 10pt; mso-ansi-language: pt-br;"></Trigger></span></div><div class="MsoNormal" style="margin: 0in 0in 0pt; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: inherit;"><span lang="PT-BR" style="color: black; mso-ansi-language: pt-br;">Com essas linhas, o TreeView não vai criar todos filhos/netos até o </span><span lang="PT-BR" style="color: black; mso-ansi-language: pt-br;">usuário vai expandir os items "pais" primeiro.</span></span></div><span style="font-family: inherit;"><span lang="PT-BR" style="color: black; mso-ansi-language: pt-br; mso-bidi-language: he; mso-fareast-font-family: calibri; mso-fareast-language: en-us; mso-fareast-theme-font: minor-latin;">Isso pode fazer os </span><span lang="PT" style="color: black; mso-ansi-language: pt; mso-bidi-language: he; mso-fareast-font-family: calibri; mso-fareast-language: en-us; mso-fareast-theme-font: minor-latin;">desempenhos muito mais rápido</span><span lang="PT-BR" style="color: black; mso-ansi-language: pt-br; mso-bidi-language: he; mso-fareast-font-family: calibri; mso-fareast-language: en-us; mso-fareast-theme-font: minor-latin;">.</span></span>Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.com1tag:blogger.com,1999:blog-83914380163392572.post-46806929551033382112011-03-04T05:10:00.000-08:002011-03-04T05:10:59.421-08:00Nova infraestratura para desenvolver aplicações de P2P passo a passoTerminei de publicar em Inglês 3 postagens que explicam como usar a minha infraestrutura que escrevi para facilitar fazer sincronização entre aplicações que usam P2P , doque usar o modelo regular de "cliente-servidor".<br />
Pensei que antes que eu vou traduzir isso para português vale a pena fazer links para quem quiser em Inglês:<br />
<ol><li><a href="http://www.roniz.net/2011/02/scalable-state-synchronization-using.html">Part 1</a> - A primeira parte que explica porque eu fiz essa infraestrutura e qual os problemas que ela resolve comparando modelo de cliente-servidor.</li>
<li><a href="http://www.roniz.net/2011/02/scalable-state-synchronization-using_25.html">Part 2</a> - Tutorial com demonstração do aplicação de demo.</li>
<li><a href="http://www.roniz.net/2011/03/scalable-state-synchronization-using.html">Part 3</a> - Como desenvolver sua própria aplicação com essa infraestrutura.</li>
</ol>Ficarei feliz em receber comentários e perguntas.Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.com0tag:blogger.com,1999:blog-83914380163392572.post-47356059573297008262011-02-10T05:39:00.000-08:002011-02-10T06:05:25.694-08:00CCCheck has stopped working<p><font size="3">De repente eu começei receber essa mensagem quando faço "build" para um projeto.</font></p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHwsZEWmXgZIyR6vhd5wp9a-SlVJCpgWAsKwqfL3tCGRN0CSw7_asTlIV4FcWxZ-tmEaEoF2DsR31NRzTpmB8x453RQnCnSfu3bJD3MxfR3f2_sLTmOz9H6wg-9b7UcHCSHH5WeAkBf_3F/s1600-h/image%5B2%5D.png"><font size="3"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhgwttYCo8a1OPL8jszcFmkv-jTtLpzfNye4mxFN3MyY_PfeLsF_8Hj03EHkW6bT_Cc7y9H5RJTCr7LNM05iXaH9YnXpMZPBZ8f6mpLLHhbZSFlFVmCqPxtu0h2vXVRm4dy5ZMOLjhZPWX/?imgmax=800" width="244" height="115"></font></a></p> <p><font size="3">Problema: O projeto configurando para trabalhar com baseline arquivo nos opoçoes do CodeContracts.</font></p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOl3qzoMDdeklnjRh_Q7SLLM7EcHA_BIlVbZi6vKykQ7w6egwjoi6ofAnuz8iwWYKyOu7Mb5P0IQ69AtIFMFNryTytwQwDKVizusEuzr8bJbK4ItFwXOPIeUXtQZPDsqI-Z6X-QUfdL_Nl/s1600-h/image%5B5%5D.png"><font size="3"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh011ZX-Xs5Z8bPGu3neQ-q3pxniDEY_Uo1dAQSrA2zXM54GpAJ2Hou2zK4D2LVz99CibmbINJ939vZIuMZcHqQKgKb9JppRHe7gBRZsVI7d-iBbV66p7gbfqZyKq2ktA6fu5aQDbPCy-D3/?imgmax=800" width="244" height="187"></font></a></p> <p><font size="3">Eu acho que isso acontece depois que eu baixei versão pelo source control e isso mudou various arquivos para "read only" (somente leitura) inclusivo o <font size="1" face="Consolas"><font size="1" face="Consolas"><font size="3" face="Arial">baseline.xml.new arquivo.</font></font></font></font></p><font face="Consolas"><font size="3" face="Consolas"> <p dir="ltr">A janela do output window mostra o exception:</p> <p dir="ltr">CodeContracts: Roniz.WCF.P2P.Messages: Unhandled Exception: System.UnauthorizedAccessException: Access to the path …\baseline.xml.new' is denied.</p> <p>soluçao:</p> <p>Tirar o "read only" atributo do arquvio/s</p></font></font> <p dir="ltr"><font size="3"></font></p> Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.com0tag:blogger.com,1999:blog-83914380163392572.post-67560367810016133262011-02-05T19:00:00.000-08:002011-02-05T20:25:05.739-08:00Blog em inglêsTenho tambêm o mesmo blog mas mais atualizado em inglês… gerlamente eu escrevo primeiro em ingles antes de traduzir para português.<br />
Para quem quiser e nesse endereço:<br />
<a href="http://www.roniz.net/" target="_blank">http://www.roniz.net/</a>Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.com0tag:blogger.com,1999:blog-83914380163392572.post-63223738455281025932011-02-05T17:15:00.001-08:002011-02-05T17:15:02.555-08:00ObservableDictionary do DR WPF com dispatcher<span xmlns="xmlns"> <p dir="ltr" align="left"><span style="font-family: arial; font-size: 13pt"><span style="color: #333333">Eu uso o ObservableDictionary que DR WPF </span><span style="color: #5588aa"><a href="http://drwpf.com/blog/2007/09/16/can-i-bind-my-itemscontrol-to-a-dictionary/comment-page-1/" target="_blank">forneceu</a></span></span><span style="color: #333333"><span style="font-family: arial; font-size: 13pt"> para WPF , porem tive problemas quando mudei o dicionario em thread diferente do que o thread que o dicionario foi criado – os eventos: CollectionChanged / PropertyChanged executaram em thread diferente.</span><span style="font-family: georgia; font-size: 12pt"> (gente como falo "thread" em portugues, mas na nossa lingua de programadores ??? <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="סמיילי" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2noVXeo3bV_MSj9ed_IOL9FFnAVj5xftoazARfUj5Bey43aLLoh0scm7aKDGl01sfz7hBa8eaPzE8-_bKIY9nn8h-tglOwrwdZjfqM3s8NBAauvs6kXHlJ2fdJ6Fm1iEfvV2nhECaMDtl/?imgmax=800"> ) <br></span></span></p> <p dir="ltr" align="left"><span style="color: #333333"><span style="font-family: arial; font-size: 13pt">Entao eu mudei o codigo um pouco para suportar isso.</span><span style="font-family: georgia; font-size: 12pt"> </span></span><span style="color: #333333"><span style="font-family: arial; font-size: 13pt">As mudanças sao:</span><span style="font-family: georgia; font-size: 12pt"> <br></span></span></p> <p dir="ltr" align="left"><span style="font-family: arial; color: #333333; font-size: 13pt">1. Nos constructors adicionei parâmetros opcionais para o dispatcher & DispatcherPriority (padrao para </span><span style="font-family: consolas; font-size: 10pt"><span style="color: #2b91af">DispatcherPriority</span><span style="color: black">.DataBind</span></span><span style="color: #333333"><span style="font-family: arial; font-size: 13pt">).</span><span style="font-family: georgia; font-size: 12pt"> <br></span></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt">public ObservableDictionary(Dispatcher dispatcher = null,DispatcherPriority dispatcherPriority = DispatcherPriority.DataBind) <br></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt">{ <br></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt"> _dispatcher = dispatcher; <br></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt"> _dispatcherPriority = dispatcherPriority; <br></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt"> _keyedEntryCollection = new KeyedDictionaryEntryCollection<TKey>(); <br></span></p> <p dir="ltr" align="left"><span style="font-family: courier new; color: #333333; font-size: 10pt">} <br></span></p> <p dir="ltr" align="left"><span style="color: #333333"><span style="font-family: arial; font-size: 13pt">2. Nos methodos que executa os OnCollectionChanged and OnPropertyChanged eventos verifiquei se o dispatcher nao e null – e ai executei o evento com o dispatcher no lugar de executar ele no thread que chamou ele.</span><span style="font-family: georgia; font-size: 12pt"> <br></span></span></p> <p style="background: #f4f4f4" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: blue">protected</span><span style="color: black"> <br></span><span style="color: blue">virtual</span><span style="color: black"> <br></span><span style="color: blue">void</span><span style="color: black"> OnCollectionChanged(NotifyCollectionChangedEventArgs args) <br></span></span></p> <p style="background: white" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt">{ <br></span></p> <p style="background: #f4f4f4" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> var handler = CollectionChanged; <br></span></p> <p style="background: white" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> </span><span style="color: blue">if</span><span style="color: black"> (handler != </span><span style="color: blue">null</span><span style="color: black">) <br></span></span></p> <p style="background: #f4f4f4" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> { <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> </span><span style="color: blue">if</span><span style="color: black"> (_dispatcher != </span><span style="color: blue">null</span><span style="color: black">) <br></span></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> { <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> </span><span style="color: blue">if</span><span style="color: black"> (_dispatcher.CheckAccess()) <br></span></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> { <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> handler(</span><span style="color: blue">this</span><span style="color: black">, args); <br></span></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> } <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> </span><span style="color: blue">else</span><span style="color: black"> <br></span></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> { <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> _dispatcher.Invoke((Action)(() => handler(</span><span style="color: blue">this</span><span style="color: black">, args)), _dispatcherPriority); <br></span></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> } <br></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> } <br></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> </span><span style="color: blue">else</span><span style="color: black"> <br></span></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> { <br></span></p> <p style="background: #f4f4f4; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; font-size: 12pt"><span style="color: black"> handler(</span><span style="color: blue">this</span><span style="color: black">, args); <br></span></span></p> <p style="background: white; margin-left: 45pt" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> } <br></span></p> <p style="background: #f4f4f4" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt"> } <br></span></p> <p style="background: white" dir="ltr" align="left"><span style="font-family: consolas; color: black; font-size: 12pt">} <br></span></p> <p dir="ltr" align="left"><span style="font-family: arial; font-size: 13pt"><span style="color: #333333">O codigo completo esta <span style="color: #5588aa"><a href="https://docs.google.com/uc?id=0B6KsyKNApE4hN2RiOWNkY2ItNTMzNi00ZDEwLWI3ZjAtZGFjYWUzOTI0YmRl&export=download&hl=en" target="_blank">aqui</a>.</span></span><span style="font-family: georgia; color: #333333; font-size: 12pt"> <br></span></span></p> <p dir="ltr" align="left"><span style="color: #333333"><span style="font-family: arial; font-size: 13pt"> </span><span style="font-family: georgia; font-size: 12pt"> <br></span></span></p> Ron zigelmanhttp://www.blogger.com/profile/03240941427278157175noreply@blogger.com0