Usuário com melhor resposta
Retardar sequencia de instruções

Pergunta
-
Olá Pessoal,
Estou necessitando de uma ajuda de vcs.
Na inicialização de um UserControl, mais precisamente no método Loaded, tenho que carregar algumas configurações que estão no Banco de Dados. Para fazer este serviço utilizo o WCF. Acontece que quando estou executando pela primeira vez e o BD esta em standby, o tempo de recuperação das informações do BD são demoradas, pois ele vai fazer todo o processo de partida do banco. Até aqui tudo bem. O meu problema é que as seqüências de procedimentos que estão no método Loaded não param, ou seja, enquanto esta ocorrendo a consulta no BD, as outras instruções continuam sendo executadas. Pegunto: Existe alguma maneira de eu retardar a execução da sequencia de procedimentos até que eu receba o retorno da consulta ao BD ?
abs,
Pedro Palma
Respostas
-
Malz... esqueci que metodo assincrono roda na mesma Thread da aplicação principal
vc vai ter q dar uma adaptada... mas o lance é jogar a chamada da carga numa outra thread mesmo... ai nem prescisa usar o assincrono
private static ManualResetEvent = new ManualResetEvent(false);
private void MeuControl_Loaded(object sender, EventArgs e) {
mre.Reset();var thread = new Thread(new ParameterizedThreadStart(Carregar));
thread.Start(objetoASerCarregado);
mre.WaitOne();// Executar o resto
}
public static void Carregar(object objeto) {
var service = new SeuWCF();
(objeto as DataGrid).DataSource = service.GetDados();
mre.Set();
}
What would Brian Boitano do ?
((2B || !2B) is Question) ?- Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
-
Oi Pedro,
Não sei se entendi errado mas porque não executa no callback o que você iria executar no handler do evento Loaded?
private void MeuControl_Loaded(object sender, EventArgs e)
{
var service = new SeuWCF();
service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted);
service.GetDadosAsync();
}private void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e)
{
// execute aqui o que faria no evento Loaded
...
}Não entendo a necessidade de realizar tudo no handler do Loaded.
Att.
Ari C. Raimundo
MCAD, MCTS
http://araimundo.blogspot.com- Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
Todas as Respostas
-
-
Com uma Thread e o ManualResetEvent :)
Vc tambem pode usar os metods assincronos do teu WCF
private void MeuControl_Loaded(object sender, EventArgs e) { this.Carregar(); // Executar o resto } public void Carregar() { mre.Reset(); var service = new SeuWCF(); service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted); service.GetDadosAsync(); mre.WaitOne(); } void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e) { // Carrega os dados na tela mre.Set(); }
What would Brian Boitano do ?
((2B || !2B) is Question) ? -
Olá
Rui Santos,
Obrigado pela sua ajuda.
Fiz exatamente conforme o seu modelo que tambem é a forma que eu uso (mas sem o mre). Debuguei o programa e esta acontecendo o seguinte:
-No método Carregar, quando chega em mre.WaitOne() ele fica aguardando e não sai do lugar, sendo necessário abortar a execução do debug,
-Se eu colocar uma valor no mre.WaitOne(1000), ele termina o metodo Carregar, volta para o metodo Loaded, executa o resto do metodo, só após a finalização do método é que vai executar o método "client_GetDadosCompleted". Ai a vaca já foi para o brejo, rs, pois é exatamente este o meu problema.
Eu quero que no metodo Loaded chame o metodo Carregar, que por sua vez execute o metodo client_GetDadosCompleted para depois retornar ao método Loadd e executar o restante do metodo.abs,
Pedro Palma
-
Malz... esqueci que metodo assincrono roda na mesma Thread da aplicação principal
vc vai ter q dar uma adaptada... mas o lance é jogar a chamada da carga numa outra thread mesmo... ai nem prescisa usar o assincrono
private static ManualResetEvent = new ManualResetEvent(false);
private void MeuControl_Loaded(object sender, EventArgs e) {
mre.Reset();var thread = new Thread(new ParameterizedThreadStart(Carregar));
thread.Start(objetoASerCarregado);
mre.WaitOne();// Executar o resto
}
public static void Carregar(object objeto) {
var service = new SeuWCF();
(objeto as DataGrid).DataSource = service.GetDados();
mre.Set();
}
What would Brian Boitano do ?
((2B || !2B) is Question) ?- Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
-
Oi Pedro,
Não sei se entendi errado mas porque não executa no callback o que você iria executar no handler do evento Loaded?
private void MeuControl_Loaded(object sender, EventArgs e)
{
var service = new SeuWCF();
service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted);
service.GetDadosAsync();
}private void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e)
{
// execute aqui o que faria no evento Loaded
...
}Não entendo a necessidade de realizar tudo no handler do Loaded.
Att.
Ari C. Raimundo
MCAD, MCTS
http://araimundo.blogspot.com- Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
-
Olá Rui e Ari,
Obrigado pelas respostas.
A solução do Rui é bastante elegante, pois é um modelo que gosto de seguir.
A solução do Ari é a mesma que eu apliquei para obter os resultados esperados e tambem funcionam perfeitamente, mas particularmente não gosto muito, por um motivo muito simples: Sou dos antigos (rs), onde aprendi a programar em Cobol, na época não tinhamos POO mas codificavamos os programas de maneira estruturada, então tinhamos um método principal onde controlavamos todas as ações do programa, fazendo as chamadas a outros métodos a partir do método principal, assim ficava facil a leitura e a manutenção por qualquer outro programador.
Mas valeu as respostas,
abs,
Pedro Palma -
olha... é bom saber usar o ManualResetEvent... por varios motivos... mas sou obrigado a concordar com o Ari nessa :P
é melhor começar a ir acostumando a usar o OO e programação assincrona pq o Silverlight é uma evolução de uma serie de conceitos atuais (Programação orientada a requisiçoes web como uma pagina ajax, mas com tratamento de eventos similiar a uma aplicaçao windows com conceito de desenho de telas em xaml....)
Deve dar mais trabalho para vc no inicio... mas manter um padrao estruturado no Silverlight vai acabar sendo mais custoso mais para frente... por exemplo... na hora que vc decidir trabalhar com Services Duplex com implementação de Callbacks...
What would Brian Boitano do ?
((2B || !2B) is Question) ?