4

私はc#が以下を使用してタイマーを使用できることを知っています:

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 1000/60;
timer.Tick += new EventHandler(TimerEventProcessor);
timer.Start();


private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
{
    //Do something
}

しかし、私はこのYouTubeチュートリアルで、使用する代わりにTimer、独自のタイマーを実装するスレッドを作成したことを確認しました。

var task = new Task(Run());
task.start();

protected void run ()
{
    while (true)
    {
        Thread.sleep(1000/60);
        //Do something
    }
}

単純な方法よりも2番目の方法を使用することに利点はありますTimerか?

4

5 に答える 5

4

System.Windows.Forms.Timerさまざまな理由よりも優れたタイミング方法がありますが、独自のスレッド管理が含まれているものはありません(各スレッドにはかなりのメモリオーバーヘッドがあるため、リソースの浪費です)。

.NETFrameworkクラスライブラリのタイマークラスの比較

記事の下からの表は次のとおりです。

+---------------------------------------+----------------------+---------------------+------------------+
|                                       | System.Windows.Forms |    System.Timers    | System.Threading |
+---------------------------------------+----------------------+---------------------+------------------+
| Timer event runs on what thread?      | UI thread            | UI or worker thread | Worker thread    |
| Instances are thread safe?            | No                   | Yes                 | No               |
| Familiar/intuitive object model?      | Yes                  | Yes                 | No               |
| Requires Windows Forms?               | Yes                  | No                  | No               |
| Metronome-quality beat?               | No                   | Yes*                | Yes*             |
| Timer event supports state object?    | No                   | No                  | Yes              |
| Initial timer event can be scheduled? | No                   | No                  | Yes              |
| Class supports inheritance?           | Yes                  | Yes                 | No               |
+---------------------------------------+----------------------+---------------------+------------------+

* Depending on the availability of system resources (for example, worker threads)
于 2013-03-22T02:08:22.957 に答える
3

イベントのタイミングをとる方法はどちらも正確ではありませんが、最初の方法はやや正確です。マークしたコード//Do somethingが100ミリ秒かかる状況を考えてみてください。その場合、の呼び出しの間隔は、予想どおりではありませ//Do somethingん。1000/60+1001000/60

于 2013-03-22T01:57:32.257 に答える
2

タイマーを提供するプラットフォームでは、タイマーを使用することを常にお勧めします。タイマーは、より効率的に実装されている可能性があるためThread.sleepです。問題はsleep、スレッドを完全にブロックし、別のスレッドに通知するためだけにスレッド全体を浪費することです。

一方、タイマーは複数回管理でき、1つのスレッドのみを使用します。オペレーティングシステムが提供するいくつかのエクスタシーを使用することもあります。しかし、それだけでなく、より正確にするために、いくつかのスケジューリングコストを考慮に入れることさえあります(少なくとも理論的には)。

于 2013-03-22T01:57:48.507 に答える
2

考えられる唯一の利点は、バックグラウンドスレッドへのオフロードです。この例では、タイマーのイベントハンドラーはUIスレッドで実行され、後者はバックグラウンドスレッドで実行されます。

ただし、代わりにTask.Delaywithasync/awaitまたはmethodを使用します。ContinueWithThread.Sleep

于 2013-03-22T02:00:15.257 に答える
1

いいえ。2番目の方法を使用する理由はまったくありません。

于 2013-03-22T01:56:25.763 に答える