Bonjour,
Développant en .Net 4.0 j'en profite pour tester les nouvelles classes et remplacer l'utilisation de la classe Thread par la classe Task. Je me confronte tout de même a un petit soucis technique, la synchronisation par rapport a la "Task" de WPF.
J'ai une fonction qui notifie la réception d'un nouveau fichier et qui envoi le résultat dans ma vue WPF :
Le délégué OnDocumentNF399Receiving envoi le résultat ensuite dans ma vue WPF.
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 private void NewFileReceived(string path) { ThreadPool.QueueUserWorkItem(s => { ICAD_RxxMessage doc = this.DocumentConvertion(s as string); if (doc != null) { //Return to principal thread App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() => { OnDocumentNF399Receiving(doc); } )); } }, path) }
Et je voudrais le remplacer par un code de ce genre la :
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 private void NewFileReceived(string path) { Task<ICAD_RxxMessage> result = Task.Factory.StartNew<ICAD_RxxMessage>(s => { ICAD_RxxMessage doc = this.DocumentConvertion(s as string); return doc; }, path,TaskCreationOptions.PreferFairness); result.ContinueWith((task) => { if (result.Result != null) { OnDocumentNF399Receiving(result.Result); } } ); }
Une exception est remonte car le contexte de synchronisation n'est pas le même.
Suis je oblige de demande à ma vue son contexte à travers un accesseur qui me renverrais le resultat de TaskScheduler.FromCurrentSynchronizationContext(), ou y a t'il un moyen simple ou une "bidouille" tel qu'il existe pour les Thread avec l'utilisation du Dispatcher ?
Merci d'avance.
Partager