Le problème est que les autres tâches qui devaient suivre la fin des calculs doivent également être placées dans le thread, sinon il n'est pas possible de continuer les opérations dans le thread principal après la fin des calculs.
namespace Test_Winform { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void butGo_Click(object sender, EventArgs e) { panel1.Visible = true; stop = false; Task.Run(LanceThread); } /// <summary> /// Ce premier thread rend la main à l'application. /// Il exécute le calcul long et attend son résultat, au pire un bool comme dans l'exemple /// </summary> private void LanceThread() { leThread = Task.Run(CalculLong); if (!leThread.Result)//attend le résultat MessageBox.Show("Calcul arrété avant la fin"); this.BeginInvoke((Action)(() => panel1.Visible = false)); } bool stop = false; Task<bool> leThread; private bool CalculLong() { for (int i = 0; i < 101; i++) { this.BeginInvoke((Action)(() => progressBar1.Value = i)); Thread.Sleep(500); if (stop) return false; } return true; } private void Form2_KeyDown(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Escape && !leThread.IsCompleted) { stop = true; } } } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionTask.RunJe pense que si tu avais connu, tu n’aurais pas posé cette question.