Метод запуска на интервале с System.Threading.Timer в winForm C # - PullRequest
3 голосов
/ 09 апреля 2011

То, что я хочу сделать, - это использовать System.Threading.Timer для выполнения метода с интервалом.Мой пример кода выглядит следующим образом:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        System.Threading.Timer t1 = new System.Threading.Timer(WriteSomething, null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(10));

    }
    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Clear();
    }

    public void WriteSomething(object o)
    {

        textBox1.Text = "Test";
    }
}

}

Разве это не предположение, что метод WriteSomething выполняется каждую 10-ю секунду?Что происходит, так это то, что WriteSomething выполняется, когда я запускаю свое приложение, и через 10 секунд приложение закрывается.Думаю, я неправильно понял, как это работает, может кто-нибудь сказать мне, как это сделать с System.Threading.Timer.

заранее спасибо, примеры кода очень приветствуются

Ответы [ 4 ]

6 голосов
/ 09 апреля 2011

Более вероятный сценарий - это то, что вылетает через 10 секунд.Вы не можете касаться каких-либо элементов управления в обратном вызове, он работает не в том потоке.Вы должны будете использовать Control.BeginInvoke ().Что делает совершенно бессмысленным использование System.Threading.Timer вместо System.Windows.Forms.Timer.

Будьте практичны.Сделайте это за 100 миллисекунд, чтобы вы не отрастили бороду в ожидании аварии.И не использует асинхронный таймер для обновления пользовательского интерфейса, это бесполезно.

4 голосов
/ 09 апреля 2011

Между прочим, в таймере System.Windows.Forms нет ничего, что не позволяет вам создавать в коде (это не просто таймер «перетаскивания»). Код:

Код конструктора:

  System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
  timer.Tick += OnTimerTick;
  timer.Interval = 10000;
  timer.Start();

Обработчик событий:

  private void OnTimerTick(object sender, EventArgs e)
  {
    // Modify GUI here.
  }
2 голосов
/ 09 апреля 2011

Просто чтобы повторить то, что сказал Ганс, в приложении WinForms все элементы графического интерфейса не являются поточно-ориентированными.Почти все методы / свойства в классах Control могут быть вызваны только в том потоке, в котором создан графический интерфейс.System.Threading.Timer вызывает свой обратный вызов в потоке пула потоков, а не в том, в котором вы создали таймер (см. Ссылку ниже из MSDN).Как сказал Ганс, вы, вероятно, хотите вместо этого использовать System.Windows.Forms.Timer, который будет вызывать ваш обратный вызов в правильном потоке.

Вы всегда можете проверить, можете ли вы вызывать методы в элементе управления (гарантируяв правильном потоке) с помощью кода:

System.Diagnostics.Debug.Assert (! InvokeRequired);

внутри обработчика событий.Если утверждение срабатывает, вы находитесь в потоке, который не может изменить этот элемент управления.

Цитировать справку MSDN по System.Threading.Timer для метода обратного вызова, который вы передали в конструктор:1011 *

Метод не выполняется в потоке, который создал таймер;он выполняется в потоке ThreadPool, предоставленном системой.

0 голосов
/ 03 августа 2012

Распространенная ошибка: необходимо сохранить переменную таймера в качестве члена класса, поскольку сборщик мусора может его убить.

...