Как включить таймер из другого потока / класса - PullRequest
4 голосов
/ 07 апреля 2009

Оригинальный пост: Как получить доступ к таймеру из другого класса в C #

Я попробовал все.

-Event

- Невозможно выполнить Invoke, поскольку у таймеров нет свойства InvokeRequired.

-Государственная / внутренняя собственность

Ничего не сработало, код выполняется, свойство timer.Enabled установлено в значение "true", но оно не устанавливается. Если я вызываю событие или просто изменяю свойство из класса формы в NON- статический метод - он работает и работает.

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

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

Ответы [ 4 ]

8 голосов
/ 07 апреля 2009

Вы должны использовать класс Timer из пространства имен System.Timers, а не элемент управления WinForms Timer, если вам нужна поддержка многопоточности. Обратитесь к документации MSDN для элемента управления WinForms Timer для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

6 голосов
/ 07 апреля 2009

Вам не нужно проверять InvokeRequired в самом контроле, вы можете проверить свойство в классе, например:

if (this.InvokeRequired) 
{ 
    BeginInvoke(new MyDelegate(delegate()
    {
        timer.Enabled = true;
    }));
}
1 голос
/ 07 апреля 2009

То, что System.Windows.Forms.Timer не имеет возможности вызывать, не означает, что ваша форма не имеет. Попробуйте мой InvokeEx из второго (или другого) потока, чтобы включить таймер.

public static class ControlExtensions
{
  public static TResult InvokeEx<TControl, TResult>(this TControl control,
                            Func<TControl, TResult> func)
    where TControl : Control
  {
    if (control.InvokeRequired)
    {
      return (TResult)control.Invoke(func, control);
    }
    else
    {
      return func(control);
    }
  }
}

При этом у меня работал следующий код:

new Thread(() =>
  {
    Thread.Sleep(1000);
    this.InvokeEx(f => f.timer1.Enabled = true);
  }).Start();

И таймер мгновенно ожил через 1 секунду.

1 голос
/ 07 апреля 2009

Я случайно попытался снова использовать invoke, на этот раз это сработало, но я приму ваш ответ, DavidM.

    public bool TimerEnable
    {
        set
        {
            this.Invoke((MethodInvoker)delegate
            {
                this.timer.Enabled = value;
            });
        }
    }


    public static void timerEnable()
    {
        var form = Form.ActiveForm as Form1;
        if (form != null)
            form.TimerEnable = true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...