1
resposta

o uso do threadsleep


using ByteBank.Core.Model;
using ByteBank.Core.Repository;
using ByteBank.Core.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ByteBank.View
{
    public partial class MainWindow : Window
    {
        private readonly ContaClienteRepository r_Repositorio;
        private readonly ContaClienteService r_Servico;

        public MainWindow()
        {
            InitializeComponent();

            r_Repositorio = new ContaClienteRepository();
            r_Servico = new ContaClienteService();
        }

        private void BtnProcessar_Click(object sender, RoutedEventArgs e)
        {
            var contas = r_Repositorio.GetContaClientes();

            var conta1 = contas.Take(contas.Count() / 2);
            var conta2 = contas.Skip(contas.Count() / 2);

            var resultado = new List<string>();

            AtualizarView(new List<string>(), TimeSpan.Zero);

            var inicio = DateTime.Now;

            Thread t1 = new Thread(() => {

                foreach (var item in conta1)
                {
                    var resultadoConta = r_Servico.ConsolidarMovimentacao(item);
                    resultado.Add(resultadoConta);
                }

            });


            Thread t2 = new Thread(() => {

                foreach (var item in conta2)
                {
                    var resultadoConta = r_Servico.ConsolidarMovimentacao(item);
                    resultado.Add(resultadoConta);
                }

            });

            t1.Start();
            t2.Start();

            while(t1.IsAlive || t2.IsAlive)
            {
                Thread.Sleep(360);


            }

        }


        private void AtualizarView(List<String> result, TimeSpan elapsedTime)
        {
            var tempoDecorrido = $"{ elapsedTime.Seconds }.{ elapsedTime.Milliseconds} segundos!";
            var mensagem = $"Processamento de {result.Count} clientes em {tempoDecorrido}";

            LstResultados.ItemsSource = result;
            TxtTempo.Text = mensagem;
        }
    }
}

ao clicar no botao e disparado a funçao btnProcessar_Click, primeiro ele atualiza view sem nada certo? ae e executado as thread e a principal dorme, quando acorda executa a funçao botao de novo e isso?

1 resposta

Olá Luan, tudo bem?

Na verdade, dei uma olhada no início do vídeo e no seu código acima está faltando a segunda chamada do método AtualizarView(). Mas o click do botão só é acionado uma vez e esse click desencadeia todo o resto do processamento.

Depois de terminar a execução do loop que verifica se as threads estão "vivas", irá executar a próxima instrução, que no caso seria atualizar a tela. Mas como eu disse, está faltando essa segunda atualização da tela no código acima.

Bons estudos!