Arquivo de julho \27\-03:00 2009
Response.Flush()
Publicado por Alexandre Valente em Uncategorized em 27/07/2009
Nestes últimos 2 dias eu perdi um tempo impressionante com algo que em tese deveria ter sido extremamente simples de fazer, tipo 5 minutos… A idéia era fazer um página que iria rodar uma operação longa ir mostrando o andamento da operação, algo como “Passo 1 executado”, “Passo 2 executado” e assim por diante…
Como a regra de negócio estava pronta, achei que fosse trivial ir gerando as tags <p> e ir mostrando o andamento com flushs… Não poderia estar mais errado! Inicialmente tentei usar o HtmlWriter do Render pra ir fazendo os Writes intercalados com os Response.Flush() (fiz um teste com Sleep() pra simular o processamento). Mas não funcionou, ele mostrava a página só no final, com todos os passos de uma vez.
Aí comecei o processo conhecido de buscar no google alguma dica ou esperiência pra entender o que estava errado. Nem precisa falar que o help da MSDN era inútil, aliás copiei e colei o exemplo deles e mesmo comportamento. Comecei a ver que este é um problema para muitas pessoas, aparentemente em algumas situações o Response.Flush() simplesmente não funciona e um mesmo código que funciona para um (como o exemplo da MSDN) não funciona pra outros.
Claro que deve ter algo na página ou no ambiente que faz com que este probelma apareça. Gastei umas boas 4 horas tentando eliminar o que era, utilizando as dicas que achei de pessoas no google para tentar mapear o que era. Mas a questão é que parecia que vários tipos de problemas acabavam se sobrepondo, o principal sendo um próprio entendimento do que o Flush() deveria fazer. Na minha visão (e na visão de várias pessoas que eu vi), ele deveria simplesmente fazer com que o conteúdo gerado até ali fosse para o browser. Mas até sobre isto haviam dúvidas. E aí vinham várias receitas, pra ligar ou desligar buffer, pra fazer com código <% %> intercalado na página ou em determinado evendo em code-behind e até para fazer várias vezes em sequência o comando Flush() para que ele funcionasse! Nenhuma alternativa funcionou pra mim, fui dormir para tentar de novo no dia seguinte.
No dia seguinte, mais 2h. O tempo gasto nisto já estava absurdo e poderia até ter feito com javascript simples, mas vocês sabem, vira questão de honra! Continuando as busca no google, achei um comentário dizendo que uma instrução específica, faria toda a diferença: Response.BufferOutput = false. E neste cenário, realmente funcionou, mas somente no código aspx direto! Já que neste caso estava funcionando, comecei a tentar isolar o que realmente causava o probelma. Mas não tive sucesso, qualquer pequena alteração fazia com que o código deixasse de funcionar. Desisti, o código final ficou desta forma:
—————————————————————————————————————–
Enfim, é impressionante como perdemos tempo com coisas triviais. Esta do Response.Flush é mais um exemplo. Fazer software é muito bom, mas este tipo de coisa não é muito!
Olá!
Publicado por Alexandre Valente em Uncategorized em 26/07/2009
Bom, depois de vários anos de resistência finalmente resolvi iniciar um blog. Não que eu não goste de escrever, justamente ao contrário, mas sempre pensei que não teria muito a contribuir às centenas de milhares de blogs já existentes…. E não acho que fazer algo repetindo o que já existe é uma tarefa que justifique que pessoas percam tempo lendo o que eu escrevo!.
Mas ultimamente eu tenho achado que tenho a contribuir em alguns aspectos. Na parte técnica (para os que não me conhecem, sou arquiteto de software; desenvolver sistemas é o que mais gosto de fazer… minha plataforma atual é .NET 3.5), eu estou pensando em colocar aqui coisas que são interessantes ou receitas para evitar que outros percam tempo com algo que eu tive que perder – e como todos da área sabem, isto é extremamente comum e frustante!
Este não é um blog pessoal (até porque não acho que valha a pena deixar tão publico aspectos pessoais de nossas vidas! rsrs), porém às vezes eu vou colocar aqui itens que eu achei interessantes e que merecem ser compartilhados, mas não se preocupem: sem ctrl-c ctrl-v!
Espero contribuir de alguma forma e quem quiser entrar em contato comigo, basta me mandar um email.