In meiner Anwendung verwende ich einen Timer, um nach Updates in einem RSS-Feed zu suchen. Wenn neue Elemente gefunden werden, öffne ich einen benutzerdefinierten Dialog, um den Benutzer zu informieren. Wenn ich den Check manuell durchführe, funktioniert alles gut, aber wenn die automatische Überprüfung in den Timern Elapsed event ausgeführt wird, wird das benutzerdefinierte Dialogfeld nicht angezeigt.Aufrufmethode auf dem GUI-Thread von einem Timer-Thread
Zunächst ist dies ein Thema Problem? (Ich gehe davon aus, dass sowohl der manuelle als auch der automatische Test denselben Code verwenden).
Wenn ich die automatische Überprüfung ausführen, muss ich die Methode aufrufen, die die Überprüfung aus dem Ereignishandler Timer Elapsed ausführt?
Gibt es etwas, was ich in meiner benutzerdefinierten Dialogklasse tun muss?
Bearbeiten: Dies ist eine winforms-Anwendung.
Hier ist ein Beispiel dafür, wie der Code ist. (Bitte erwähnen Sie in diesem Codebeispiel keine Syntaxfehler, dies ist nur ein einfaches Beispiel, kein realer Code).
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());
}
}
}
Nachdem ich einige der Kommentare und Antworten zu lesen, ich glaube, mein Problem ist, dass ich ein System.Timers.Timer
keine System.Windows.Forms.Timer
verwenden.
EDIT:
Nach dem Aufsuchen einer Forms.Timer Erstprüfung Wechsel sieht gut aus (aber keine neuen Elemente existieren noch haben also nicht den benutzerdefinierten Dialog zu sehen ist). Ich habe ein wenig Code hinzugefügt, um die Thread-ID in eine Datei auszugeben, wenn die Update-Methode aufgerufen wird. Mit dem Timer.Timer war die Thread-ID nicht der GUI-Thread, aber mit dem Forms.Timer ist die Thread-ID identisch mit der GUI.
Ja, es ist ein Threading-Problem - aber die Antwort hängt davon ab, ob Sie WPF oder WinForms verwenden: Was ist das? – x0n
Und ich bin überrascht, dass Sie keine Ausnahmen sehen: Welche Version von .NET laufen Sie auf? Können Sie Beispielcode anzeigen? –
Können Sie bitte den Code posten? – TalentTuner