クラスにそのプロパティの1つを毎秒変更させたい。変更はメインスレッドではなくクラスレベルで行われることになっていますが、どうすればよいですか?
質問する
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は別のスレッド(ThreadPoolスレッド)で呼び出されるため、プロパティの読み取り中はインスタンスをロックすることを忘れないでください
于 2012-10-21T12:12:24.943 に答える
1
別のスレッドで実行したい場合は、BackgroundWorker
プロパティを変更するロジックを使用して配置しDoWork
ます。
何かを繰り返し実行したい場合は、クラスを使用するのではなくloop
、backgroundworkerDoWork()
メソッドの内部を使用する必要があります。Timer
これを使用するのは無意味に思えます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;
}
プロパティを停止したいときはいつでも、Updationは次のCancelAsync
ようにonworkerインスタンスを呼び出します-
worker.CancelAsync();
于 2012-10-21T12:13:30.833 に答える
1
現在、.net6では非常に簡単です。
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)
{ ... }
私の推測では、タイマーはコンポーネントであり、コントロールではないため、フォームの外部でも使用できます。
于 2012-10-21T12:09:44.720 に答える