Olá pessoal tudo bem?
Adorei o curso mas ainda ficam muitas perguntas que ainda não consegui compreender.
Para fixar as aulas estou fazendo uns testes simulando processamento pesado porém ainda não consegui fazer esse programa rodar sem congelar a interface.
Será que alguém pode me orientar? Estou fazendo errado? Aonde estou errando?
Entender o async e await será uma coisa muito importante no meu trabalho e queria fixar bem esse conteúdo.
Segue o código:
Form1.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private CancellationTokenSource _cts;
private int _max = 100000000;
public Form1()
{
InitializeComponent();
}
private async void btnExecutar_Click(object sender, EventArgs e)
{
DesabilitarControles();
Inicializando();
var progresso = new Progress<string>(mensagem => progressBar1.Value++);
try
{
lblStatus.Text = $"Carregando";
var valores = await Executar(progresso);
HabilitarControles();
lblStatus.Text = "Processo finalizado";
}
catch (OperationCanceledException)
{
lblStatus.Text = "Operação cancelada pelo usuário";
}
}
private async Task<int[]> Executar(IProgress<string> progresso)
{
// Exemplo 1
IList<int> valores = Enumerable.Range(0, _max).ToList();
var tasks = valores.Select(x =>
{
return Task.Factory.StartNew(() =>
{
progresso.Report(x.ToString());
return x;
});
});
// Exemplo 2
// var tasks = Task.Factory.StartNew(() =>
// {
// for(var count = 0;count<_max;count++)
// {
// progresso.Report(count.ToString());
// }
//
// return 1;
// });
return await Task.WhenAll(tasks);
}
private void Inicializando()
{
lblStatus.Text = "Inicializando";
progressBar1.Maximum = _max;
progressBar1.Minimum = 0;
progressBar1.Value = 0;
_cts = new CancellationTokenSource();
}
private void HabilitarControles()
{
lblStatus.Text = "Habilitando controles";
btnExecutar.Enabled = true;
btnCancelar.Enabled = false;
}
private void DesabilitarControles()
{
lblStatus.Text = "Desabilitando controles";
btnExecutar.Enabled = false;
btnCancelar.Enabled = true;
}
private void btnCancelar_Click(object sender, EventArgs e)
{
_cts.Cancel();
btnCancelar.Enabled = false;
}
}
}
No método Executar fiz 2 exemplos e ambos deixam a tela do Windows Forms congelada.
Como Saber se está gerando uma thread quando gera esse código? Porque esse código está congelando a tela?
Obrigado desde já pessoal!