none
Janela de Aguardando RRS feed

  • Pergunta

  • Galera tenho o seguinte método executado por uma task

      public void run()
            {
                using (Form mensagem = new frmMensagem())
                {
                    mensagem.ShowDialog();
                }
                
    
            }

    O mesmo é chamado aqui

     ValidatorField.IntegerAndLetter(e);
                    ValidatorField.NoSpace(e);
    
                    var ts = new CancellationTokenSource();
                    CancellationToken ct = ts.Token;
                    Task task = new Task(run, ct);
    
    
                    if ((Keys)e.KeyChar == Keys.Enter)
                    {
                        task.Start();
    
                        CarregarComandaAtiva();
                        MostrarBotaoVendaSeExisteItensNaComanda();
                        LimparTxt(new List<TextBox>() { txtCodigoDaComanda });
                        _FocoNoTxt(txtQuantidade);
                        ts.Cancel();
                        if (ct.IsCancellationRequested)
                        {
                            
                                new frmMensagem().Close();
                           
    
                        }

    O problema que o código passa por esse if e executa o fechamento do grid apos o termino da tarefa, mas o form continua lá, ou seja, não fecha.


    __________________________________________________________________________________________________________ Atenciosamente, Mike Rodrigues De Lima.

    domingo, 5 de julho de 2015 17:19

Respostas

  • Olá Mike,

    ao que parece o problema é que você está utilizando um new frmMensagem. E isso irá gerar uma nova instância do formulário. Recomendo que você crie uma variável global no seu form, e utilize a mesma variável para fazer o .ShowDialog e para fazer o .Close.

    Da seguinte forma:

    private frmMensagem mensagem = null;
    
    public void run()
    {
            mensagem = new frmMensagem();
    	mensagem.ShowDialog();
    }

    ValidatorField.IntegerAndLetter(e);
    ValidatorField.NoSpace(e);
    
    var ts = new CancellationTokenSource();
    CancellationToken ct = ts.Token;
    Task task = new Task(run, ct);
    
    
    if ((Keys)e.KeyChar == Keys.Enter)
    {
    	task.Start();
    	CarregarComandaAtiva();
    	MostrarBotaoVendaSeExisteItensNaComanda();
    	LimparTxt(new List<TextBox>() { txtCodigoDaComanda });
    	_FocoNoTxt(txtQuantidade);
    	ts.Cancel();
            if (ct.IsCancellationRequested)
            {
            	mensagem.Close();
                           
    	}
    }


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".


    Eu já tinha tentado isso mais sempre me dava esse erro: Operação entre threads inválida: controle '' acessado de um thread que não é aquele no qual foi criado.

    __________________________________________________________________________________________________________ Atenciosamente, Mike Rodrigues De Lima.

    Mike,

    para resolver esse problema de Operação entre threads inválida coloque o seguinte comando antes da chamada:

    CheckForIllegalCrossThreadCalls = false;

    • Sugerido como Resposta Lucio Rogerio SPBanned quarta-feira, 22 de julho de 2015 00:48
    • Marcado como Resposta Mike Lima quinta-feira, 30 de julho de 2015 14:30
    quarta-feira, 22 de julho de 2015 00:35

Todas as Respostas

  • Olá Mike,

    ao que parece o problema é que você está utilizando um new frmMensagem. E isso irá gerar uma nova instância do formulário. Recomendo que você crie uma variável global no seu form, e utilize a mesma variável para fazer o .ShowDialog e para fazer o .Close.

    Da seguinte forma:

    private frmMensagem mensagem = null;
    
    public void run()
    {
            mensagem = new frmMensagem();
    	mensagem.ShowDialog();
    }

    ValidatorField.IntegerAndLetter(e);
    ValidatorField.NoSpace(e);
    
    var ts = new CancellationTokenSource();
    CancellationToken ct = ts.Token;
    Task task = new Task(run, ct);
    
    
    if ((Keys)e.KeyChar == Keys.Enter)
    {
    	task.Start();
    	CarregarComandaAtiva();
    	MostrarBotaoVendaSeExisteItensNaComanda();
    	LimparTxt(new List<TextBox>() { txtCodigoDaComanda });
    	_FocoNoTxt(txtQuantidade);
    	ts.Cancel();
            if (ct.IsCancellationRequested)
            {
            	mensagem.Close();
                           
    	}
    }


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".


    Eu já tinha tentado isso mais sempre me dava esse erro: Operação entre threads inválida: controle '' acessado de um thread que não é aquele no qual foi criado.

    __________________________________________________________________________________________________________ Atenciosamente, Mike Rodrigues De Lima.

    segunda-feira, 6 de julho de 2015 20:13
  • Boa Tarde Mike,

    O seu problema já foi solucionado ou ainda está pendente?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 20 de julho de 2015 20:32
  • Olá Mike,

    ao que parece o problema é que você está utilizando um new frmMensagem. E isso irá gerar uma nova instância do formulário. Recomendo que você crie uma variável global no seu form, e utilize a mesma variável para fazer o .ShowDialog e para fazer o .Close.

    Da seguinte forma:

    private frmMensagem mensagem = null;
    
    public void run()
    {
            mensagem = new frmMensagem();
    	mensagem.ShowDialog();
    }

    ValidatorField.IntegerAndLetter(e);
    ValidatorField.NoSpace(e);
    
    var ts = new CancellationTokenSource();
    CancellationToken ct = ts.Token;
    Task task = new Task(run, ct);
    
    
    if ((Keys)e.KeyChar == Keys.Enter)
    {
    	task.Start();
    	CarregarComandaAtiva();
    	MostrarBotaoVendaSeExisteItensNaComanda();
    	LimparTxt(new List<TextBox>() { txtCodigoDaComanda });
    	_FocoNoTxt(txtQuantidade);
    	ts.Cancel();
            if (ct.IsCancellationRequested)
            {
            	mensagem.Close();
                           
    	}
    }


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".


    Eu já tinha tentado isso mais sempre me dava esse erro: Operação entre threads inválida: controle '' acessado de um thread que não é aquele no qual foi criado.

    __________________________________________________________________________________________________________ Atenciosamente, Mike Rodrigues De Lima.

    Mike,

    para resolver esse problema de Operação entre threads inválida coloque o seguinte comando antes da chamada:

    CheckForIllegalCrossThreadCalls = false;

    • Sugerido como Resposta Lucio Rogerio SPBanned quarta-feira, 22 de julho de 2015 00:48
    • Marcado como Resposta Mike Lima quinta-feira, 30 de julho de 2015 14:30
    quarta-feira, 22 de julho de 2015 00:35