我想让一个类每秒更改它的一个属性。更改应该发生在类级别而不是主线程中,我该怎么做?
问问题
7332 次
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 而不是使用Timer
class ,因为使用 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 回答