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.

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.