Bonjour,
J'utilise depuis un ans async/await pour mon code asynchrone dans mon appli wpf pour garder mon UI réactive et j'aimerais savoir ce qui différencie les trois codes suivants.
Le premier est élégants et marche très bien. Le deuxième donne le même résultat que le premier mais le code devient vite un jolie sac de nœud. Le troisième ressemble beaucoup au premier mais le thread de l'UI n'apprécie pas du tout qu'on essaye de la tripoter depuis un autre thread (RaisePropertyChanged). Il est évident que async/await utilise Task. Qu'est ce qui fait que le code de la méthode asynchrone soit sur le thread de l'UI et pas celui de la Task ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public async Task DoSomething() { Progress = "Start something long enough which will freeze the UI if not asynchronous"; RaisePropertyChanged(nameof(Progress)); await Task.Factory.StartNew(() => Thread.Sleep(5000)); Progress = "Step2"; RaisePropertyChanged(nameof(Progress)); await Task.Factory.StartNew(() => Thread.Sleep(5000)); Progress = "Done"; RaisePropertyChanged(nameof(Progress)); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void DoSomething() { Progress = "Start something long enough which will freeze the UI if not asynchronous"; RaisePropertyChanged(nameof(Progress)); var t1 = Task.Factory.StartNew(() => Thread.Sleep(5000)); t1.GetAwaiter().OnCompleted(() => { Progress = "Step2"; RaisePropertyChanged(nameof(Progress)); var t2 = Task.Factory.StartNew(() => Thread.Sleep(5000)); t2.GetAwaiter().OnCompleted(() => { Progress = "Done"; RaisePropertyChanged(nameof(Progress)); }); }); }
Je comprends pas bien non plus la différence entre les notions d'asynchrone et de parallèle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public Task DoSomething() { return Task.Factory.StartNew(() => { Progress = "Start something long enough which will freeze the UI if not asynchronous"; RaisePropertyChanged(nameof(Progress)); Thread.Sleep(5000); Progress = "Step2"; RaisePropertyChanged(nameof(Progress)); Thread.Sleep(5000); Progress = "Done"; RaisePropertyChanged(nameof(Progress)); }); }
Lorsque je créer une task, le code est exécuté en parallèle.
Le mot clé async permet de faire du code asynchrone.
Pourtant lorsque l'on fait un await. L'UI reste réactive et je peux de nouveau appuyer sur mon bouton et relancer ma méthode asynchrone. Ce qui veut bien dire que je peux avoir plusieurs méthode asynchrone en parallèle. Alors c'est quoi la différences entres ces Task qui s'exécute en parallèle et celles que je créer à l'aide de Task ?
Partager