W mojej aplikacji używam licznika czasu do sprawdzania aktualizacji w kanale RSS, jeśli zostaną znalezione nowe elementy, wyświetlam niestandardowe okno dialogowe, aby poinformować użytkownika. Kiedy uruchomię czek ręcznie, wszystko działa świetnie, ale gdy automatyczne sprawdzanie zostanie uruchomione w zegarach Elapsed, niestandardowe okno dialogowe nie zostanie wyświetlone.Metoda wywołania na wątku GUI z wątku timerów
Po pierwsze jest to problem z wątkiem? (Zakładam, że tak jest, ponieważ zarówno ręczne, jak i automatyczne sprawdzenie używa tego samego kodu).
Po uruchomieniu automatycznego sprawdzania, czy muszę wywołać metodę, która uruchamia kontrolę z programu obsługi zdarzeń Czas oczekiwania?
Czy jest coś, co powinienem zrobić w mojej klasie okna dialogowego?
Edytuj: to jest aplikacja WinForm.
Oto przykład kodu. (Proszę nie wskazywać błędów składni w tym przykładzie kodu, to tylko prosty przykład, a nie prawdziwy kod).
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());
}
}
}
Po przeczytaniu niektórych komentarzy i odpowiedzi, myślę, że moim problemem jest to, że używam nie System.Timers.Timer
System.Windows.Forms.Timer
.
EDIT:
Po zmianie do Forms.Timer wstępnych testów wygląda dobrze (ale żadne nowe elementy istnieją jeszcze tak nie widać okna niestandardowe). Dodałem trochę kodu, aby wyprowadzić identyfikator wątku do pliku po wywołaniu metody aktualizacji. Za pomocą Timers.Timer identyfikator wątku nie był wątkiem GUI, ale przy użyciu Forms.Timer identyfikator wątku jest taki sam jak GUI.
Tak, jest to problem z gwintowaniem - ale odpowiedź zależy od tego, czy używasz WPF, czy WinForm: co to jest? – x0n
I jestem zaskoczony, że nie widzisz żadnych wyjątków: w jakiej wersji .NET to działasz? Czy możesz pokazać przykładowy kod? –
Czy możesz opublikować kod? – TalentTuner