Task et synchronisation du thread UI
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 :
Code:
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)
} |
Le délégué OnDocumentNF399Receiving envoi le résultat ensuite dans ma vue WPF.
Et je voudrais le remplacer par un code de ce genre la :
Code:
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.