如何为计时器使用安全线程(从不同线程更改计时器属性)

时间:2009-04-07 10:56:29

标签: c# winforms multithreading timer

要访问表单上的备忘录,请使用以下代码

    public string TextValue
    {
        set
        {
            if (this.Memo.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    this.Memo.Text += value + "\n";
                });
            }
            else
            {
                this.Memo.Text += value + "\n";
            }
        }
    }

我想使用相同的代码启用/禁用我的计时器,但计时器没有属性InvokeRequired。

    public int Timer
    {
        set
        {
            if (this.timer.InvokeRequired) //?? No such thing
            {
                this.Invoke((MethodInvoker)delegate
                {
                    if (value == 1)
                        this.timer.Enabled = true;
                    else
                        this.timer.Enabled = false;
                });
            }
            else
            {
                if (value == 1)
                    this.timer.Enabled = true;
                else
                    this.timer.Enabled = false;
            }
        }
    }

如何从其他线程启用计时器?

2 个答案:

答案 0 :(得分:2)

“this”是表单对象吗?

假设您使用表单设计器创建了Timer对象,该对象由创建表单的线程创建,因此检查表单的InvokeRequired属性会有效地告诉您相同的事情。

答案 1 :(得分:1)

从以下代码中删除计时器:

public int Timer
{
    set
    {
        if (this.InvokeRequired) 
        {
            this.Invoke((MethodInvoker)delegate
            {
                if (value == 1)
                    this.timer.Enabled = true;
                else
                    this.timer.Enabled = false;
            });
        }
        else
        {
            if (value == 1)
                this.timer.Enabled = true;
            else
                this.timer.Enabled = false;
        }
    }
}