USAR A THREAD NA INICIALIZAçãO

 Tópico anterior Próximo tópico Novo tópico

USAR A THREAD NA INICIALIZAçãO

C#

 Compartilhe  Compartilhe  Compartilhe
#497181 - 10/06/2021 19:44:52

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Pessoal boa noite
Estou iniciando em C# e tenho um pequeno problema para ajustar o sistema a trabalhar com um processo em segundo plano

namespace NovoTeste
{
    public partial class Form1 : Form
    {
        public int CodClienteSelecionado;

        private TimeSpan HoraNula;
        private TimeSpan HoraInvalida;

Mais precisamente com o código da criação da list abaixo, esse comando FUNCIONA PERFEITAMENTE, só que demora 2 min
        private readonly ListObjectsResponse Consulta = Movimentacao.Consulta();

        public Form1()
        {
            InitializeComponent();
        }


Bom essa Consulta é feita pela classe Movimentacao, ela faz uma consulta em um determinado lugar pegando toda a estrutura de arquivos e pastas e que utilizo essa lista para poder comparar se teve alteração com algum determinado documento, é como se fosse um backup.
Porém essa consulta demora para carregar cerca de 2 min, pela quantidade enorme de informação que tem no local, e eu não quero que o sistema ao abrir fique esses 2 min ou mais travado para poder carregar o form principal.

Sei que o thread permite executar uma tarefa em segundo plano, porém não estou conseguindo essa thread, porque das formas que tentei, uma ele não aparece a opção Consulta
Thread t = new Thread(new ThreadStart(new Action(() => Consulta = new Movimentacao.Consulta())));

A outra ele não consegue iniciar o processo de busca dos dados

Enfim, tentei algumas coisas e não consegui nada, estou praticamente o dia todo batalhando
Sei que tem uma forma de usar o Delegate, não sei se é esse o caso, más não consegui nada também, tudo pq esse objeto tem que ser carregado antes de qualquer coisa, para que o sistema rode direitinho

Agradeço se alguém puder ajudar

Teoria quando se sabe tudo, e nada funciona. Prtica e quando tudo funciona e ningum sabe porque.
[]Aquele que quer aprender gosta que lhe digam quando esta errado;
s o tolo no gosta de ser corrigido -[]Prov.12:1


#497193 - 11/06/2021 11:44:23

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Citação:
Sei que o thread permite executar uma tarefa em segundo plano, porém não estou conseguindo essa thread, porque das formas que tentei, uma ele não aparece a opção Consulta
Thread t = new Thread(new ThreadStart(new Action(() => Consulta = new Movimentacao.Consulta())));


Isso provavelmente acontece, porque a variavel Consulta está em numa thread diferente (que é a principal).  

Aparece alguma mensagem de erro ?



#497196 - 11/06/2021 16:03:35

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


CLEVERTON obrigado pelo retorno

Nesse caso não tem nenhuma thread no sistema, estou dificuldade de montar ela
'porém não estou conseguindo CRIAR essa thread,' <- acabei comendo uma palavra que faz toda diferença na frase

Como comentei o trecho que funciona é esse
private readonly ListObjectsResponse Consulta = Movimentacao.Consulta();

Dai em uma das tentativas, montei o esquema e NÂO da nenhum erro, só que ele não carrega a Consulta
private static ListObjectsResponse Consulta;
Thread t = new Thread(new ThreadStart(new Action(() => Consulta = Movimentacao.Consulta())));

Com a opção readonly , ele dava o erro que não poderia atualizar uma variável de somente leitura, então deixei ele como static, seguindo a orientação do VS

Caso eu tente iniciar a thread, logo abaixo
t.Start();
Ele da o erro que o t não existe no contexto inicial e + 5 erros referente a essa tentativa de iniciar

Não tenho outros projetos no sistema, o que tenho são várias classes

Todo esse erro acontece porque estou tentando colocar esse thread logo na inicialização, antes de qqer coisa rodar, porque quando o sistema inicia a classe
private readonly ListObjectsResponse Consulta = Movimentacao.Consulta();
Ele ja carrega o list e deixa ele pronto e ai que vai iniciar os outros componentes e objetos


Teoria quando se sabe tudo, e nada funciona. Prtica e quando tudo funciona e ningum sabe porque.
[]Aquele que quer aprender gosta que lhe digam quando esta errado;
s o tolo no gosta de ser corrigido -[]Prov.12:1


Resposta escolhida #497198 - 11/06/2021 17:34:12

OCELOT
SOROCABA
Cadast. em:Março/2012


Última edição em 11/06/2021 17:35:43 por OCELOT

Me parece que você está tentando fazer isso direto na classe, no mesmo lugar que você declarou a variável, tipo assim
namespace NovoTeste
{
    public partial class Form1 : Form
    {
        public int CodClienteSelecionado;

        private TimeSpan HoraNula;
        private TimeSpan HoraInvalida;

        private static ListObjectsResponse Consulta;
        Thread t = new Thread(new ThreadStart(new Action(() => Consulta = Movimentacao.Consulta())));
        t.Start();

        public Form1()
        {
            InitializeComponent();
        }


Se for isso então está errado mesmo, pois você está na declaração da classe, até criar a variavel poderia dizer que está ok, mas não pode ter código solto assim na declaração da classe.

O que eu diria é pra você jogar isso no construtor da classe, algo assim

namespace NovoTeste
{
    public partial class Form1 : Form
    {
        public int CodClienteSelecionado;

        private TimeSpan HoraNula;
        private TimeSpan HoraInvalida;

        private static ListObjectsResponse Consulta;

        public Form1()
        {
            Thread t = new Thread(new ThreadStart(new Action(() => Consulta = Movimentacao.Consulta())));
            t.Start();
            InitializeComponent();
        }


Desta forma ele iniciaria a thread e já continua a fazer o que faz normalmente, porém eu diria que usar Thread diretamente não é o ideal, se quiser usar Thread mesmo pode simplificar um pouco o código pois não precisa ficar criando os delegates, pode ser direto
Thread t = new Thread(() => Consulta = Movimentacao.Consulta());

Eu diria para usar um Task, e se quiser fazer algo logo depois que terminar de carregar também é possível aproveitar o async/await para fazer isso, por exemplo digamos que quero colocar um label dizendo que está carregado as tabelas e quero limpar ele logo no final, poderia fazer algo do tipo
public partial class Form1 : Form
{
    public int CodClienteSelecionado;

    private TimeSpan HoraNula;
    private TimeSpan HoraInvalida;

    private static ListObjectsResponse Consulta;
        private Task taskCarregaDados;

    public Form1()
    {
        InitializeComponent();
        //colocar depois do InitializeComponent faz com que eu possa acessar os controles do Form, guardo a task em uma variável para eu poder verificar se já terminou de executar, eu poderia colocar antes para começar a carregar o mais cedo possível, mas eu não poderia alterar o label por exemplo
        taskCarregaDados = CarregaDados();
    }
    
       private async Task CarregaDados()
       {
       LabelDeStatus.Text = 'Carregando dados...';
       //O StartNew com o LongRunning faz com que seja criada e iniciada uma Task em um novo Thread
       await Task.Factory.StartNew(() => Consulta = Movimentacao.Consulta(), TaskCreationOptions.LongRunning);
       //Como foi usado o await quando ele termina de executar a próxima linha é executada no contexto em que foi feita a chamada inicial, que no caso é a Main Thread
       LabelDeStatus.Text = 'Dados carregados';
       }

Além disso como tenho a task digamos que o cliente clique para abrir uma tela que usa esses dados, eu poderia verificar o taskCarregaDados.IsCompleted para saber se já terminou de carregar




#497199 - 11/06/2021 18:05:41

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Ocelot obrigado pelo retorno

Estou testando agora o Thread e ja darei um retorno.
Quanto a eu querer usar ou não, para mim não tinha outra opção, pois como comentei sou novo no C# e estou começando a apanhar dele rsrsrs, eu até tinha visto o task, más não sabia que ele permitia também o sistema abrir e rodar a consulta em segundo plano igual o Thread

Agradeço pela explicação também do Task e vou testar também essa função

Teoria quando se sabe tudo, e nada funciona. Prtica e quando tudo funciona e ningum sabe porque.
[]Aquele que quer aprender gosta que lhe digam quando esta errado;
s o tolo no gosta de ser corrigido -[]Prov.12:1


#497200 - 11/06/2021 18:50:05

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Ocelot, quero agradecer pela ajuda e pela explicação sobre o Task, as duas formas rodaram 100%

O seu comando do Task até adiantou uma coisa que eu até tinha deixado pronta que eram os pontos no label

Teoria quando se sabe tudo, e nada funciona. Prtica e quando tudo funciona e ningum sabe porque.
[]Aquele que quer aprender gosta que lhe digam quando esta errado;
s o tolo no gosta de ser corrigido -[]Prov.12:1


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por ALVAROVB2009 em 11/06/2021 18:50:26