4

クラスにそのプロパティの1つを毎秒変更させたい。変更はメインスレッドではなくクラスレベルで行われることになっていますが、どうすればよいですか?

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は別のスレッド(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 に答える