Comment utiliser correctement Dispatcher.BeginInvoke?

J’ai cherché presque partout sur Internet, et j’ai tant de fois cherché dans Google et trouvé autant de résultats, mais je ne parviens toujours pas à trouver la solution à mon problème.

Je suis en train de convertir une ancienne application WinForms en une nouvelle application WPF, mais je rencontre des problèmes avec certaines commandes. Dans l’application Winforms, ils utilisent Control.BeginInvoke() et les stockent dans un object IAsyncResult. J’ai lu que Dispatcher.BeginInvoke() est l’équivalent WPF de Control.BeginInvoke() pour WinForms mais j’obtiens cette erreur lorsque j’utilise

Dispatcher.BeginInvoke (): “Impossible de convertir implicitement le type ‘System.Windows.Threading.DispatcherOperation’ en ‘System.IAsyncResult’. Une conversion explicite existe (vous manque-t-il un cast?)”.

Toute aide serait appréciée.

Voici le code que je tente de convertir. Ceci est le code WinForms origine. Je suis capable de convertir tout sauf la partie BeginInvoke.

  private eSkan.api.TeSkanAPI feSkanAPI = null; private void MessageFilter_AddRemove_Invoked(bool AddFilter, IMessageFilter Filter) { if (AddFilter){ Application.AddMessageFilter(Filter); } else { Application.RemoveMessageFilter(Filter); } } private void MessageFilter_AddRemove(bool AddFilter, IMessageFilter Filter) { { IAsyncResult sr = BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, AddFilter, Filter); sr.AsyncWaitHandle.WaitOne(2000); } } 

Vous trouverez ci-dessous le code que j’ai converti jusqu’à présent, y compris la partie BeginInvoke avec laquelle je lutte.

  private void MessageFilter_AddRemove_Invoked(bool addFilter, System.Windows.Forms.IMessageFilter filter) { if (addFilter) { System.Windows.Forms.Application.AddMessageFilter(filter); } else { System.Windows.Forms.Application.RemoveMessageFilter(filter); } } private void MessageFilter_AddRemove(bool addFilter, System.Windows.Forms.IMessageFilter filter) { { IAsyncResult sr = System.Windows.Threading.Dispatcher.BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, addFilter, filter); sr.AsyncWaitHandle.WaitOne(2000); } } 

S’il y a d’autres erreurs, merci de me le faire savoir.

Merci

En effet, Dispatcher.BeginInvoke , bien qu’il s’agisse d’une opération logique équivalente, ne renvoie pas un IAsyncResult , il renvoie un DispatcherOperation . Jetez un coup d’œil à ce billet et vous verrez un bon exemple du fonctionnement de Dispatcher . J’ai copié l’exemple de code pertinent ici pour m’assurer qu’il existera plus tard.

 public Window1() { InitializeComponent(); CheckBox myCheckBox = new CheckBox(); myCheckBox.Content = "A Checkbox"; System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart( delegate() { System.Windows.Threading.DispatcherOperation dispatcherOp = myCheckBox.Dispatcher.BeginInvoke( System.Windows.Threading.DispatcherPriority.Normal, new Action( delegate() { myCheckBox.IsChecked = true; } )); dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); } )); thread.Start(); } void dispatcherOp_Completed(object sender, EventArgs e) { Console.WriteLine("The checkbox has finished being updated!"); } 

Prenez note à cette ligne:

 dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); 

c’est ainsi que vous saurez quand son travail sera terminé – il vous rappellera via cet événement.