6
respostas

Tarefas em execução exibindo em um monitor de logs

Olá estou precisando de alguma dica. Tenho uma aplicação executando tarefas e gerando um arquivo log.txt, tenho também um textbox de múltiplas linhas, eu gostaria de na medida que fosse gerando informações no arquivo txt atualizar meu textbox online.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
6 respostas

Tentei fazer o seguinte, não sei se foi o melhor caminho:

Task taskA = new Task( () => {
                r = scripts.MeuMetodo(user);
                while (!r.EndOfStream)
                {
                    values.AppendLine(r.ReadLine());
                    scripts.EscreverLogs(values);
                    tbMonitor.Text = values.ToString();
                }
            });

            taskA.Start();

Nesse caso ocorre o seguinte erro: Message=Operação entre threads inválida: controle 'tbMonitor' acessado de um thread que não é aquele no qual foi criado.

Oi Alberto, tudo bem?

Se a informação parte de uma thread diferente da thread da interface do usuário, você precisa utilizar o método Dispatcher.BeginInvoke():

Dispatcher.BeginInvoke((Action)(() => tbMonitor.Text = values.ToString()));

Olá professor tudo jóia. Esse método não existe no meu contexto

 while (!responseReader.EndOfStream)
                {
                    values.AppendLine(responseReader.ReadLine());
                    scripts.MonitorMensagensOpenVpn(values);
                    Dispatcher.BeginInvoke((Action)(() => tbMonitor.Text = values.ToString()));
                    // tbMonitor.Text = values.ToString();
                }

O método pode ser invocado dentro do laço while mesmo?

Esse é um projeto WindowForm com .Net Framework 4.6.1

Eu mudei um pouco o cenário para ver se ficava mais fácil estou na seguinte situação. Estou com um projeto WindowsForm criei um botão que vai ler um arquivo txt e atualizar meu TextBox a cada 2 segundos.

 private void btConect_Click(object sender, EventArgs e)
        {                     
                Thread demoThread = new Thread(new ThreadStart(AtualizaTextBox));
                demoThread.Start();                                     
        }
 private void AtualizaTextBox()
        {
            Thread.Sleep(TimeSpan.FromSeconds(2));
            string confMinhaVPN = Settings.GetPathConfOpenVPN();

            using (var fluxo = new FileStream(path + @"\meulog.log", FileMode.Open))
            using (var leitor = new StreamReader(fluxo))
            {
                while(!leitor.EndOfStream)
                {
                    tbMonitor.Text = leitor.ReadLine();
                }
            }               
        }

Também cai no mesmo problema: "controle 'tbMonitor' acessado de um thread que não é aquele no qual foi criado"

Oi Alberto

Você deve colocar no início do arquivo .cs:

using System.Windows.Threading;

Com isso, a classe Dispatcher pode ser usada. Veja se funciona, por favor.