Artikel ini memperincikan membina pemasa resolusi tinggi dalam C# yang mencetuskan acara pada selang waktu tertentu, menawarkan kawalan yang lebih halus daripada kelas System.Timer
standard. Kami akan meneroka had pilihan .NET sedia ada dan membentangkan penyelesaian menggunakan Windows Multimedia Timer API.
Walaupun kelas Stopwatch
menyediakan ukuran masa resolusi tinggi, ia tidak direka bentuk untuk mencetuskan peristiwa pada selang masa yang tepat. Rangka kerja .NET itu sendiri tidak mempunyai persamaan langsung dengan keperluan kita. Oleh itu, kami akan memanfaatkan Windows Multimedia Timer API, yang dioptimumkan untuk pemasaan acara.
Di bawah ialah pelaksanaan C# menggunakan API Pemasa Multimedia:
<code class="language-csharp">using System; using System.Runtime.InteropServices; class MultimediaTimer : IDisposable { private bool disposed = false; private int interval, resolution; private uint timerId; private readonly MultimediaTimerCallback Callback; public delegate void MultimediaTimerCallback(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2); public event EventHandler<EventArgs> TimerElapsed; public MultimediaTimer() { Callback = new MultimediaTimerCallback(TimerCallbackMethod); Resolution = 5; // Default resolution (milliseconds) Interval = 10; // Default interval (milliseconds) } ~MultimediaTimer() { Dispose(false); } public int Interval { get { return interval; } set { CheckDisposed(); if (value > 0) interval = value; } } public int Resolution { get { return resolution; } set { CheckDisposed(); if (value > 0 && value <= interval) resolution = value; } } public void Start() { CheckDisposed(); uint result = timeSetEvent((uint)interval, (uint)resolution, Callback, IntPtr.Zero, 1); if (result == 0) throw new Exception("Failed to start timer."); timerId = result; } public void Stop() { CheckDisposed(); if (timerId != 0) timeKillEvent(timerId); timerId = 0; } private void TimerCallbackMethod(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2) { TimerElapsed?.Invoke(this, EventArgs.Empty); } private void CheckDisposed() { if (disposed) throw new ObjectDisposedException("MultimediaTimer"); } protected virtual void Dispose(bool disposing) { if (!disposed) { Stop(); disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } [DllImport("winmm.dll")] private static extern uint timeSetEvent(uint uDelay, uint uResolution, MultimediaTimerCallback lpTimeProc, IntPtr dwUser, uint fuEvent); [DllImport("winmm.dll")] private static extern uint timeKillEvent(uint uTimerID); }</code>
Pertimbangan Penting:
API Pemasa Multimedia berinteraksi dengan tetapan seluruh sistem; pelarasan boleh menjejaskan prestasi sistem. Pantau kekerapan pemasa untuk memastikan ia sepadan dengan selang sasaran. Ingat bahawa Windows bukan OS masa nyata, jadi beban sistem mungkin menjejaskan ketepatan pemasa.
API Pemasa Multimedia menyediakan mekanisme yang berkuasa untuk mencipta pemasa resolusi tinggi dengan isyarat berasaskan peristiwa dalam C#, menangani senario di mana pemasaan yang tepat adalah kritikal. Walaupun bukan ciri .NET asli, keupayaannya menjadikannya alat yang berharga untuk keperluan pemasaan tertentu.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Pemasa Resolusi Tinggi dengan Isyarat Selang Berasaskan Acara dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!