Appel de méthode sur le thread GUI à partir d'un minuteries fil
Dans mon application j'utilise un timer pour vérifier les mises à jour d'un flux RSS, si de nouveaux éléments sont découvert que j'avais une fenêtre de dialogue personnalisée pour informer l'utilisateur. Quand je lance le vérifier manuellement tout fonctionne très bien, mais lors de l'enregistrement automatique s'exécute dans le minuteries événement Écoulé le dialogue personnalisée n'est pas affiché.
Tout d'abord est-ce un thread en question? (Je suppose que c'est parce que à la fois le manuel et automatique cochez la case utiliser le même code).
Quand je lance l'enregistrement automatique, dois-je appeler la méthode qui exécute le contrôle de la Minuteries Écoulé gestionnaire d'événement?
Est-il quelque chose que je dois faire dans ma classe de boîte de dialogue personnalisée?
Edit:
c'est une application winforms.
Voici un exemple de ce que le code est comme. (Merci de ne pas remarquer les erreurs de syntaxe dans cet exemple de code, c'est juste un exemple simple, pas de code réel).
public class MainForm : System.Windows.Forms.Form
{
//This is the object that does most of the work.
ObjectThatDoesWork MyObjectThatDoesWork = new ObjectThatDoesWork();
MyObjectThatDoesWork.NewItemsFound += new NewItemsFoundEventHandler(Found_New_Items);
private void Found_New_Items(object sender, System.EventArgs e)
{
//Display custom dialog to alert user.
}
//Method that doesn't really exist in my class,
//but shows that the main form can call Update for a manual check.
private void Button_Click(object sender, System.EventArgs e)
{
MyObjectThatDoesWork.Update();
}
//The rest of MainForm with boring main form stuff
}
public class ObjectThatDoesWork
{
System.Timers.Timer timer;
public ObjectThatDoesWork()
{
timer = new System.Timers.Timer();
timer.Interval = 600000;
timer.AutoReset = true;
timer.Elapsed += new new System.Timers.ElapsedEventHandler(TimeToWork);
timer.Start();
}
private void TimeToWork(object sender, System.Timers.ElapsedEventArgs e)
{
Update();
}
public void Update()
{
//Check for updates and raise an event if new items are found.
//The event is consumed by the main form.
OnNewItemsFound(this);
}
public delgate void NewItemsFoundEventHandler(object sender, System.EventArgs e);
public event NewItemsFoundEventHandler NewItemsFound;
protected void OnNewItemsFound(object sender)
{
if(NewItemsFound != null)
{
NewItemsFound(sender, new System.EventArgs());
}
}
}
Après avoir lu certains commentaires et réponses, je pense que mon problème est que je suis à l'aide d'un System.Timers.Timer
pas un System.Windows.Forms.Timer
.
EDIT:
Après changer de Formes.Minuterie d'analyse initiale semble bon (mais pas de nouveaux éléments existent encore et n'ont pas vu la boîte de dialogue personnaliser). J'ai ajouté un peu de code pour afficher l'ID de thread à un fichier lors de la mise à jour de la méthode est appelée. À l'aide de la minuterie.Minuterie de l'ID de thread n'était pas le thread GUI, mais en utilisant les Formulaires.Minuterie de l'ID de thread est le même que le GUI.
Et je suis surpris que vous ne voyez pas toutes les exceptions: quelle est la version de .NET exécutez-vous? Pouvez-vous montrer un exemple de code?
Pouvez-vous s'il vous plaît poster le code ?
Si vous faites glisser et déposez le Système.Les minuteries.La minuterie de la boîte à outils sur la forme il va automatiquement déclencher des événements sur le thread GUI. Voir l'article que j'ai lié dans ma réponse.
ObjectThatDoesWork ne définit pas NewItemsFound. Poster le code serait beaucoup plus facile pour vous aider à
OriginalL'auteur Tester101 | 2010-10-18
Vous devez vous connecter pour publier un commentaire.
Qui minuterie utilisez-vous? Système.De Windows.Les formulaires.La minuterie se déclenche automatiquement l'événement sur le thread de l'INTERFACE utilisateur. Si vous utilisez un autre, vous aurez besoin d'utiliser De contrôle.Invoquer pour appeler la méthode sur le thread de l'INTERFACE utilisateur.
+1000! Système.De Windows.Les formulaires.Minuterie résout tous mes très frustrant "Objet créé sur un autre thread" timer questions! Merci!
comme une blague, j'ai passé une journée!!!! Merci, et être conscient
OriginalL'auteur Giorgi
Vous devez utiliser les Formulaires.Minuterie ici, ou si vous utilisez d'autres types de minuteries, de sérialiser les appels de l'INTERFACE utilisateur avec
.Invoke()
OriginalL'auteur Daniel Mošmondor
Est votre application WPF Application? Si oui, vous devez déléguer le travail à partir de votre arrière-plan-fil pour le Répartiteur associés avec le thread d'INTERFACE utilisateur.
Poster du code, de sorte que vous pouvez obtenir la meilleure aide et avoir un regard sur la classe Dispatcher http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx
OriginalL'auteur cordellcp3
OriginalL'auteur Koray