4

我想让一个类每秒更改它的一个属性。更改应该发生在类级别而不是主线程中,我该怎么做?

4

4 回答 4

8

您应该使用 System.Threading.Timer:

private System.Threading.Timer timer;

public YourClass()
{
    timer = new System.Threading.Timer(UpdateProperty, null, 1000, 1000);
}

private void UpdateProperty(object state)
{
    lock(this)
    {
        // Update property here.
    }
}

请记住在读取属性时锁定实例,因为 UpdateProperty 在不同的线程(线程池线程)中调用

于 2012-10-21T12:12:24.943 回答
1

如果您想在不同的线程上进行操作,请使用BackgroundWorker更改属性的逻辑并将其放入DoWork.

如果你想重复做某事,你应该只loop在 backgroundworkerDoWork()方法中使用 a 而不是使用Timerclass ,因为使用 with 似乎毫无意义BackgroundWorker。这是一些粗略的代码:

public Form1()
{
    InitializeComponent();

    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += new DoWorkEventHandler(DoWork);
}

private void DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    int delay = 1000; // 1 second
    while (!worker.CancellationPending)
    {
        do something
        Thread.Sleep(delay);
    }
    e.Cancel = true;
}

每当您想停止属性更新时,都会CancelAsync像这样调用 on worker 实例 -

worker.CancelAsync();
于 2012-10-21T12:13:30.833 回答
1

现在在.net 6 中非常简单。

using System;
using System. Threading;
using PeriodicTimer timer = new (TimeSpan.FromSeconds (1));|
 while (await timer.WaitForNextTickAsync ())
{
    //implement your code here
}
于 2021-11-04T18:57:30.877 回答
-1

在表单中,最简单的方法是创建一个计时器。

public Form1()
{
    InitializeComponent();

    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(Tick);
}

private void Tick(object sender, EventArgs e)
{ ... }

我的猜测是您甚至可以在表单之外使用 Timer,因为它是组件而不是控件。

于 2012-10-21T12:09:44.720 回答