CLONANDO E COMPARANDO LIST<T>
Bom dia pessoal, mais uma vez estou aqui com dúvidas em relação a List<T>.
O que eu precisava agora é saber qual a melhor maneira de se fazer isso:
Eu preencho um DataGridView com uma List<T> de contatos onde traz todos os registros, menos o usuário, dessa maneira:
Agora eu precisava colocar em um Timer uma rotina para verificar em um intervalo de tempo, se existem contatos novos ou se algum foi excluÃdo.
Então pensei em fazer assim: quando preencher o DataGridView, fazer uma cópia (clone) da lista contatos, chamada lista_compara_contatos;
AÃ quando executar o Timer, ele cria uma nova lista contatos e compara com a lista compara contatos;
Se as duas forem idênticas, não faz nada, apenas se não forem idênticas é que vai dar um refresh no DataGridView;
Isso porque se toda vez que o Timer executar, o DataGridView vai ficar dando refresh, e fica um efeito muito desagradável, ele parece que fica [Ô]piscando[Ô].
Como faço para fazer um clone da lista contatos e como faço para compará-la?
Encontrei alguns exemplos na internet mas nenhum está funcionando.
O que eu precisava agora é saber qual a melhor maneira de se fazer isso:
Eu preencho um DataGridView com uma List<T> de contatos onde traz todos os registros, menos o usuário, dessa maneira:
lista_contatos = new Contato().GetAll();
lista_contatos = lista_contatos.Where(x => x.Nome != _user).OrderBy(x => x.Nome).ToList();
dgvContatos.DataSource = lista_contatos;
Agora eu precisava colocar em um Timer uma rotina para verificar em um intervalo de tempo, se existem contatos novos ou se algum foi excluÃdo.
Então pensei em fazer assim: quando preencher o DataGridView, fazer uma cópia (clone) da lista contatos, chamada lista_compara_contatos;
AÃ quando executar o Timer, ele cria uma nova lista contatos e compara com a lista compara contatos;
Se as duas forem idênticas, não faz nada, apenas se não forem idênticas é que vai dar um refresh no DataGridView;
Isso porque se toda vez que o Timer executar, o DataGridView vai ficar dando refresh, e fica um efeito muito desagradável, ele parece que fica [Ô]piscando[Ô].
Como faço para fazer um clone da lista contatos e como faço para compará-la?
Encontrei alguns exemplos na internet mas nenhum está funcionando.
Antes de te dar a solução do que você realmente quer, queria entender uma coisa: Você não vai adicionar os contatos pelo seu sistema? Se sim, não seria mais fácil simplesmente disparar a rotina de atualizar o grid logo após adicionar o contato? Você tem algum motivo especial para usar o timer?
é que funciona assim:
Ao abrir o form, o grid dos contatos é preenchido. Acontece que se algum usuário se cadastrar, tem que aparecer pra mim automaticamente, sem eu precisar clicar em algum botão, por exemplo para dar um refresh no grid, entendeu? Por isso que eu disse de colocar em um Timer. Aà ele faz a verificação a cada x segundos e se tiver alteração n a List<T> ele dá o refresh, senão não faz nada.
Ao abrir o form, o grid dos contatos é preenchido. Acontece que se algum usuário se cadastrar, tem que aparecer pra mim automaticamente, sem eu precisar clicar em algum botão, por exemplo para dar um refresh no grid, entendeu? Por isso que eu disse de colocar em um Timer. Aà ele faz a verificação a cada x segundos e se tiver alteração n a List<T> ele dá o refresh, senão não faz nada.
Entendi.
A primeira vista, usar um Timer ou uma Thread parece ser a solução mais simples mesmo. Só que é bom salientar que o mais simples (de implementação) vai ser custoso para seu sistema. Ficar consumindo processamento direto.
Nesse caso, eu usaria uma comunicação interna via Socket pra isso. Assim quando eu acabasse de adicionar, enviaria uma mensagem comunicando para o outro usuário que foi adicionado um contato e assim eu atualizaria o grid.
Enfim...
Para clonar:
Para verificar se é a mesma lista:
A primeira vista, usar um Timer ou uma Thread parece ser a solução mais simples mesmo. Só que é bom salientar que o mais simples (de implementação) vai ser custoso para seu sistema. Ficar consumindo processamento direto.
Nesse caso, eu usaria uma comunicação interna via Socket pra isso. Assim quando eu acabasse de adicionar, enviaria uma mensagem comunicando para o outro usuário que foi adicionado um contato e assim eu atualizaria o grid.
Enfim...
Para clonar:
List<Mensagem> clone = mensagens.ToList();
Para verificar se é a mesma lista:
if (Enumerable.SequenceEqual(mensagens, clone))
{
}
O que você quer é uma sincronia entre os dados locais(os visualizados) e o server(o banco de dados), certo? Se for, tenho boas e más notÃcias pra você...
Isso não seria um caso para tratamento de concorrência de dados?
Veja esses links:
http://www.macoratti.net/vbn5_icd.htm
http://www.macoratti.net/13/05/adn_vvc1.htm
http://www.macoratti.net/07/10/vbn5_tcd.htm
http://www.macoratti.net/adn_ccd1.htm
Veja esses links:
http://www.macoratti.net/vbn5_icd.htm
http://www.macoratti.net/13/05/adn_vvc1.htm
http://www.macoratti.net/07/10/vbn5_tcd.htm
http://www.macoratti.net/adn_ccd1.htm
Lá vem o Kerplunk me desanimar de novo!!!!!
Primeiro conta as más notÃcias que é pra me deixar prá baixo.
Depois conta as boas (se é que existe mesmo) que aà eu me alegro um pouquinho. rsrs
Primeiro conta as más notÃcias que é pra me deixar prá baixo.
Depois conta as boas (se é que existe mesmo) que aà eu me alegro um pouquinho. rsrs
A má notÃcia é que se você quer fazer isso da maneira correta, vai dar um pouco de trabalho.
A boa notÃcia é que tem solução.
Você pode simplesmente fazer o que você quer, colocar um timer ou thread que atualize os dados à cada x intervalo de tempo, mas isso vai consumir recursos desnecessariamente. A maneira mais correta para se fazer isso seria com uma WebAPI, com notificações PUSH e por isso que daria um pouco de trabalho, pois você teria que mudar bastante coisa no seu sistema. Com isso, você estaria investindo em algo que será de grande valia para seus sistemas. WebAPI, vai ser útil quando você quiser migrar tudo para um ambiente web. Uma alternativa para fazer isso, é o uso de uma técnica que chamo de [Ô]beacon[Ô]. Consiste em um programa server(seja por winsock, ou http) que notifica clients quando da atualização de dados. Ele dispara uma mensagem para os clients que fizeram possuem os dados atualizados e com isso se faz o update. é mais ou menos como um [Ô]chat de dados[Ô]. Mas é também trabalhoso de ser implementado e a implementação de WebAPI além de menos trabalhosa, é mais vantajosa, visto a gama de possibilidades que ela proporciona comparado com uma aplicação tão especÃfica quanto a que descrevi.
A boa notÃcia é que tem solução.
Você pode simplesmente fazer o que você quer, colocar um timer ou thread que atualize os dados à cada x intervalo de tempo, mas isso vai consumir recursos desnecessariamente. A maneira mais correta para se fazer isso seria com uma WebAPI, com notificações PUSH e por isso que daria um pouco de trabalho, pois você teria que mudar bastante coisa no seu sistema. Com isso, você estaria investindo em algo que será de grande valia para seus sistemas. WebAPI, vai ser útil quando você quiser migrar tudo para um ambiente web. Uma alternativa para fazer isso, é o uso de uma técnica que chamo de [Ô]beacon[Ô]. Consiste em um programa server(seja por winsock, ou http) que notifica clients quando da atualização de dados. Ele dispara uma mensagem para os clients que fizeram possuem os dados atualizados e com isso se faz o update. é mais ou menos como um [Ô]chat de dados[Ô]. Mas é também trabalhoso de ser implementado e a implementação de WebAPI além de menos trabalhosa, é mais vantajosa, visto a gama de possibilidades que ela proporciona comparado com uma aplicação tão especÃfica quanto a que descrevi.
Vou ter que me aprofundar melhor neste lance de WebApi, pois até hoje só consegui programar alguma coisa pra Desktop.
Não sei se conseguirei muito progresso, visto que a [Ô]idade[Ô] já chegou e ando meio desanimado com as coisas que acontecem no nosso paÃs, na sociedade em geral e isso está se refletindo um pouco em mim, me deixando meio triste e desanimado.
Mas prometo que vou tentar. E com certeza surgirão várias novas dúvidas e que vocês meus amigos do VBMania vão ter que ter muita paciência comigo se quiserem me ajudar.
Abraços a todos.
Não sei se conseguirei muito progresso, visto que a [Ô]idade[Ô] já chegou e ando meio desanimado com as coisas que acontecem no nosso paÃs, na sociedade em geral e isso está se refletindo um pouco em mim, me deixando meio triste e desanimado.
Mas prometo que vou tentar. E com certeza surgirão várias novas dúvidas e que vocês meus amigos do VBMania vão ter que ter muita paciência comigo se quiserem me ajudar.
Abraços a todos.
Paciência não é problema! Poste suas dúvidas à vontade. Se souber, respondo. Se necessário, faço exemplos, como já fiz várias vezes para várias pessoas aqui mesmo no fórum e em outros.
Valeu, Kerplunk, realmente você já me ajudou e muito. Vou ter que começar revendo os teus vÃdeos sobre WebApi.
Tópico encerrado , respostas não são mais permitidas