نگار قاسمی
نگار قاسمی
خواندن ۲ دقیقه·۲ سال پیش

یک .Net و این همه تایمر!

۶ کلاس مختلف تایمربرای .Net وجود دارد. هر تایمر کاربرد مخصوص خودش را دارا می‌باشد.

تایمر‌های زیر مخصوص اجرای کد در thread های مخصوص UI می‌باشد.

  • System.Windows.Forms.Timer
  • System.Windows.Threading.DispatcherTimer

این تایمر ها callback را در UI thread اجرا می‌کنند. در هر دوی این موارد وقتی در سمت UI یک ایونت Raise می‌شود، تنها یک Callback در لحظه اتفاق می‌افتد. بنابراین Thread safe هستند.

تایمر دیگری که برای وب فرم ها وجود دارد، System.Web.UI.Timer است. این تایمر یک رویداد postback در سرور ایجاد می کند.

در نهایت سه تایمر دیگر وجود دارد که مخصوص UI نیستند:

  • System.Threading.Timer
  • System.Threading.PeriodicTimer
  • System.Timers.Timer

ساده ترین و ابتدایی ترین نوع تایمر System.Threading.Timer می‌باشد. این تایمر Callbackرا در ThreadPool برنامه ریزی می کند. اگر اجرای handler در زمان بیشتری نسبت به بازه زمانی مشخص شده برای اجرا طول بکشد، handler دوباره اجرا می شود و در نهایت با چندین handler در حال اجرا به صورت موازی مواجه خواهید شد.


تایمرSystem.Timers.Timer به صورت داخلی از System.Threading.Timerاستفاده می کند و دارای چند ویژگی دیگر مانند AutoReset، Enabled، یا SynchronizingObject می‌باشد که امکان پیکربندی نحوه اجرای Callback ها را فراهم می کند. همچنین، رویداد Tick اجازه می دهد تا چندین handler را ثبت کنید. بنابراین، یک تایمر می تواند چندین handler را فعال کند. همچنین می توانید پس از راه اندازی تایمر، handler را تغییر دهید.


آخرین تایمر اضافه شده به کتابخانه های دات نت System.Threading.PeriodicTimer است. هدف اصلی این تایمر استفاده در حلقه ها و پشتیبانی از رویداد های async است. این یک رویداد Tick ندارد، اما دارای یک متد به نام WaitForNextTickAsync می‌باشد. این متد یک <ValueTask<bool برمی گرداند که وقتی تیک بعدی آماده شد تکمیل می شود. مقدار bool نشان می دهد که آیا تایمر از بین رفته است یا خیر. بنابراین، می توانید از آن در یک حلقه while استفاده کنید. به لطف این طراحی، callback ها دچار overlap نمی‌شوند.

منبع


تایمرtimernet
شاید از این پست‌ها خوشتان بیاید