Compte tenu du C# exemple de code:Comment exécuter gestionnaire d'événements sur thread cible
using System;
using System.Threading;
using System.Windows.Forms;
public class MnFrm : Form
{
private void MnFrm_Load(Object sender, EventArgs e)
{
this.WorkCompleted += MnFrm_WorkCompleted;
}
private void btn_Click(Object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(AsyncMethod);
}
private void MnFrm_WorkCompleted(Object sender, Boolean e)
{
MessageBox.Show("Work completed");
}
private void AsyncMethod(Object state)
{
// Do stuff
Boolean result = true; // just as an example
WorkCompleted?.Invoke(this, result);
}
private event EventHandler<Boolean> WorkCompleted;
}
Lorsque l'utilisateur clique sur le bouton btn
la méthode AsyncMethod
est exécutée sur un autre thread géré par le ThreadPool. Après un certain temps, le travail est terminé et le résultat est affiché via un autre événement. Ce gestionnaire d'événements (WorkCompleted
) s'exécute sur le thread utilisé pour exécuter AsyncMethod
car lorsque l'application est exécutée, vous obtenez l'exception "Cross-Threading".
La question est donc de savoir comment exécuter le gestionnaire d'événements MnFrm_WorkCompleted
sur le thread UI?
La solution correcte dépend de ce que 'AsyncMethod' est réellement en train de faire.Si la méthode accède à des ressources externes, alors votre code peut être modifié pour fonctionner efficacement sur un thread sans se soucier des threads/invoke et d'autres problèmes liés au multithread. – Fabio
Pourquoi utilisez-vous 'QueueUserWorkItem' au lieu de' var result = wait Task.Run (...) '? Il est disponible dans toutes les versions .NET prises en charge et convertit tout ce code en une ligne * simple * qui gère correctement les opérations asynchrones. La première version .NET prise en charge est 4.5.2. 'await' a été ajouté plus tôt, en 4.5. Tâches dans 4.0 –
Même si vous devez signaler quelque chose à partir d'un autre thread, n'utilisez pas d'événements. C'est le travail de l'interface IProgress et de la classe 'Progresss ' –