私は、System.Timers.Timer が独自のスレッドを作成し、(UI スレッドで実行される Windows.Forms.Timer とは対照的に) より正確なタイミングを実行するタスクを実行するために、Microsoft がこのタイプのタイマーを推奨しているという印象を受けました。
以下のコード (私が思うに) は、空のフォームを持つプロジェクトにコピー アンド ペーストできるはずです。私のマシンでは、tmrWork を 1 秒あたり約 60 回より速く動作させることができず、驚くほど不安定です。
Public Class Form1
Private lblRate As New Windows.Forms.Label
Private WithEvents tmrUI As New Windows.Forms.Timer
Private WithEvents tmrWork As New System.Timers.Timer
Public Sub New()
Me.Controls.Add(lblRate)
InitializeComponent()
End Sub
Private StartTime As DateTime = DateTime.Now
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
tmrUI.Interval = 100
tmrUI.Enabled = True
tmrWork.Interval = 1
tmrWork.Enabled = True
End Sub
Private Counter As Integer = 0
Private Sub tmrUI_Tick(sender As Object, e As System.EventArgs) _
Handles tmrUI.Tick
Dim Secs As Integer = (DateTime.Now - StartTime).TotalSeconds
If Secs > 0 Then lblRate.Text = (Counter / Secs).ToString("#,##0.0")
End Sub
Private Sub tmrWork_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) _
Handles tmrWork.Elapsed
Counter += 1
End Sub
End Class
この特定の単純なケースでは、すべてを tmrUI に配置しても同じパフォーマンスが得られます。System.Timers.Timer を高速化しすぎようとしたことは一度もないと思いますが、このパフォーマンスは私にはあまりにも悪いように見えます。ハードウェアで高性能タイマーを使用する独自のクラスを作成しましたが、1 秒あたり 100 ティックと言うことができる組み込みタイマーが必要なようです。
何が起きてる?