Назовите метод на потоке GUI от потока таймеров

В моем приложении я использую таймер для проверки на обновления в канале RSS, если новые объекты найдены, я открываюсь пользовательское диалоговое окно для информирования пользователя. Когда я осуществляю проверку вручную, все работает отлично, но когда автоматические выполнения проверки в событии Elapsed таймеров пользовательское диалоговое окно не отображены.

В первую очередь, действительно ли это - проблема потока? (Я предполагаю, что это - потому что и ручная и автоматическая проверка использует тот же код).

То, когда я осуществляю автоматическую проверку, я должен вызвать метод, который осуществляет проверку от Таймеров, Протекло обработчик событий?

Есть ли что-то, что я должен сделать в своем пользовательском диалоговом классе?

Править: это - приложение winforms.

Вот пример того, на что похож код. (Не указывайте на синтаксические ошибки в этом примере кода, это - просто простой пример не реальный код).

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());
        }
    }
}

После чтения некоторых комментариев и ответов, я думаю, что моя проблема состоит в том, что я использую a System.Timers.Timer не a System.Windows.Forms.Timer.

Править:

После изменения на Формы. Начальная буква таймера тестирующие хорошие взгляды (но никакие новые объекты существуют все же так, не видела пользовательское диалоговое окно). Я добавил немного кода для вывода идентификатора потока в файл, когда метод обновления называют. Использование Таймеров. Таймер идентификатор потока не был потоком GUI, но использованием Форм. Таймер идентификатор потока совпадает с GUI.

9
задан Tester101 18 October 2010 в 13:54
поделиться