[PT]
Hoje, enquanto estava a desenvolver um aplicação em Silverlight, reparei num comportamento um pouco estranho quando a aplicação era iniciada… basicamente passado algum tempo a aplicação em Silverlight bloqueava e por consequência o browser também. Ok, até aqui tudo bem, costumam dizer que o problema reside entre a cadeira e o teclado, portanto fui analisar dentro das últimas alterações que tinha feito. Descobri que o problema estava relacionado com uma animação que estava a tentar fazer que envolvia algumas Storyboard que definiam a sequência da animação. Uma vez que necessitava de saber quando é que as storyboards terminavam para dar sequência na animação, declarei como normalmente se faz os routedevents para saber quando “agir” segundo o objectivo.
StoryboardTagLinePos1.Completed += new EventHandler(StoryboardTagLinePos1_Completed);
StoryboardTagLinePos2.Completed += new EventHandler(StoryboardTagLinePos2_Completed);
StoryboardTagLinePos3.Completed += new EventHandler(StoryboardTagLinePos3_Completed);
Até aqui tudo parace bem, mas o erro está no facto da declaração destes eventHandlers estar dentro do método que era chamado para dar seguimento na lógica da animação… ora isto gera algo como… stack overflow… porque são referenciadas muitas referências para os mesmos eventos! A maneira correcta e recomendada é que estas definições sejam feitas no método ini do controlo que estamos a utilizar, mas o que queria aqui destacar, é que não se trata de um erro de linguagem ou lógica, mas sim de fluxo da utilização das referências para os eventos. Além da aplicação ficar “gelada” e o browser também, o que é de destacar, a dificuldade em depurar este tipo de problemas ou mesmo existirem ferramentas para tal… mesmo o Silverlight spy também bloqueou. Todavia, é de salvar que o sistema operativo isolou o “problema” impedindo que este lindo e útil erro se propagasse na memória que nem um louco! Lol.
Ok, é só uma dica para ter em atenção quando estamos a desenvolver aplicações em Sl.
Já agora, saiu a versão de Outubro do Silverlight toolkit: http://silverlight.codeplex.com/, basicamente um turbo para as aplicações em sl.
Obrigado.
[EN]
Today when, I was developing a Silverlight application I noticed that after a while that application was launched on the browser, the application frozen… and even more frozen the browser…
So obviously I thought that was something related with a latest change on my project and it was related with some kind of animation that I was trying to do. I used some storyboards in order to give a sequence on the animation, and I need to know in the application when each storyboard ended so has usual I declared the routed events… something like:
StoryboardTagLinePos1.Completed += new EventHandler(StoryboardTagLinePos1_Completed);
StoryboardTagLinePos2.Completed += new EventHandler(StoryboardTagLinePos2_Completed);
StoryboardTagLinePos3.Completed += new EventHandler(StoryboardTagLinePos3_Completed);
But the slight mistake was that this declarations were inside of the method that I call each time that I need to do something with the animation… yeah… the stack and memory went crazy!! Many and multiple repeated references to the same trigger events! Lol
So obviously the right way is declare the same routed event but outside the method… usually and the recommended way is on the control init method to avoid situation like that.
But besides my “donkey” mistake, what I really notice is that I couldn’t find any tool to help on this issue, even Silverlight spy went frozen… so one good thing is that the OS in somehow protected the rest by “frizzing” the application and prevent a full stack overflow…
Just a thing to keep in mind when developing sl applications.
Btw the October Silverlight toolkit release is out: http://silverlight.codeplex.com/ this is a very very powerful “toy” to boost sl apps :P
Thanks.
[cross posted from: http://blogs.fullsix.pt/2009/10/20/silverlight-routed-events-and-silverlight-toolkit/]
Posted
10-20-2009 0:16
by
Gonçalo Chaves