如何从不同的线程/类启用计时器

发布于 2024-07-16 02:25:34 字数 432 浏览 4 评论 0原文

原始帖子:如何从C# 中的另一个类

我尝试了一切。

-Event

-Invoke 无法完成,因为计时器没有 InvokeRequired 属性。

-公共/内部属性

没有任何作用,代码正在执行,timer.Enabled属性被设置为“true”,但它没有勾选。如果我调用该事件或只是更改表单类中的属性非静态方法 - 它确实有效。

我从来不知道我会花一天甚至更多的时间来掌握如何使用一个像样的计时器。

如果没有办法做到这一点,我是否可以使用其他与计时器类似的东西(延迟、启用/禁用)?

Original post: How to access a timer from another class in C#

I tried everything.

-Event

-Invoke can't be done,because Timers don't have InvokeRequired property.

-Public/internal property

Nothing worked,the code is being executed,the timer.Enabled property is being set to "true" ,but it doesn't Tick.If I call the event or just change the property from the form class in a NON-static method - it does tick and works.

I never knew it would take me a day and probably more to acquire how to use a decent timer.

If there's no way to do this,is there anything else I can use that works similiar to the timer(delay,enable/disable)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

把时间冻结 2024-07-23 02:25:34

如果您需要多线程支持,您应该使用 System.Timers 命名空间中的 Timer 类,而不是 WinForms Timer 控件。 有关详细信息,请查看 WinForms Timer 控件的 MSDN 文档:

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

You should use the Timer class from the System.Timers namespace, and not the WinForms Timer control, if you want multi-threading support. Check the MSDN documentation for the WinForms Timer control for more information:

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

油饼 2024-07-23 02:25:34

您不需要检查 Control 本身的 InvokeRequired ,您可以检查类上的属性,例如:

if (this.InvokeRequired) 
{ 
    BeginInvoke(new MyDelegate(delegate()
    {
        timer.Enabled = true;
    }));
}

You don't need to check InvokeRequired on the Control iteself, you can check the property on the class e.g.:

if (this.InvokeRequired) 
{ 
    BeginInvoke(new MyDelegate(delegate()
    {
        timer.Enabled = true;
    }));
}
‖放下 2024-07-23 02:25:34

我不小心再次尝试使用调用,这次成功了,但我会接受你的回答,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;
    }

I accidently tried to use invoke again,this time it worked,but I'll accept your answer,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;
    }
愁杀 2024-07-23 02:25:34

仅仅因为 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 秒后立即启动。

Just because System.Windows.Forms.Timer doesn't have the ability to invoke, doesn't mean that your form doesn't. Try my InvokeEx from the second (or other) thread to enable the timer.

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

With this, the following code worked for me:

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

And the timer instantly sprung to life after the 1 second.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文