J'ai donc un problème intéressant (pour moi de toute façon). J'écris une application qui exécute une analyse et publie les informations d'une classe dans un Windows Form. Actuellement, je crée une instance d'un formulaire, en accédant à l'ActiveForm, puis en publiant du texte dans une fonction publique sous cette forme.Publication de texte d'événement de classe multithread à Windows ActiveForm
Scan.cs
// Sets the text of scan history in the ui
private void SetScanHistory(string text)
{
MyWinForm1 form = (MyWinForm1)MyWinForm1.ActiveForm;
if (form != null)
{
form.SetText(text);
}
}
MyWinForm1.cs
// Sets the text of txtScanHistory to the text
public void SetText(string text)
{
this.Invoke((MethodInvoker)delegate
{
// txtScanHistory is a TextBox
txtScanHistory.Text += text + Environment.NewLine;
});
}
Alors maintenant, cela fonctionne assez bien. Le problème est lorsque l'utilisateur change de focus à partir du Windows Form le texte arrête de mettre à jour, ce qui explique pourquoi j'ai "if (form! = Null)". Je sais que ce n'est pas une façon idéale de faire ce que j'essaye de faire, alors ma question est comment puis-je changer ce code pour qu'il soit quelque chose comme un événement personnalisé dans "MyWinForm1"? Ou, s'il y a un autre moyen de le faire, j'aimerais voir des alternatives.
Je suis un peu confus. Dans mon exemple, SetScanHistory ne fait pas partie de la classe Form1. Aussi, si je devais faire ceci, comment pourrais-je faire pour définir le texte de ma classe "Scan" puisque toutes les fonctions sont privées? –
Donc, j'ai fait un peu de lecture sur SynchronizationContext et je ne pense pas que ce soit ce que je cherche. Je n'ai aucun problème avec le threading pour le moment, le problème consiste à poster du texte d'une instance d'une classe dans un winform. Je ne sais pas si SynchronizationContext aide avec ceci, j'aimerais voir si cela peut. Mais en ce moment j'ai besoin d'aide pour la gestion des événements personnalisés. –