PDA

View Full Version : سوال: تایمر نوشته شده با ترید



alireza_kaka
جمعه 09 خرداد 1393, 14:31 عصر
سلام اساتید
تایمری که ما با Threading مینویسیم چه فرقی با تایمر معمولی داره؟آیا رو CPU Usage هم اثری داره؟

mehdi.mousavi
شنبه 10 خرداد 1393, 15:07 عصر
سلام اساتید تایمری که ما با Threading مینویسیم چه فرقی با تایمر معمولی داره؟آیا رو CPU Usage هم اثری داره؟

سلام.

System.Windows.Forms.Timer همونطوریکه از نامش پیداست در Windows Form ها استفاده میشه و در واقع WM_TIMER رو در Message Queue قرار میده. در نتیجه، Invoke شدن Callback Function مربوطه بصورت Synchronous خواهد بود؛ یعنی اگر همون لحظه که Button ای روی فرم فشرده میشه، Timer مورد نظر Expire بشه، تا وقتی اجرای Button Handler تموم نشده، Callback Function شمارنده Call نخواهد شد.
System.Timers.Timer که مایکروسافت بهش server-side timer میگه، در واقع Thread Safe هستش و Instance ای از این کلاس از Thread های مختلف قابل دسترسه. در این نوع Timer بصورت پیش فرض، Callback Function مربوطه توسط Thread ای از Thread Pool فراخوانی میشه، بنابراین باید مراقب همزمانی ها باشید. عملکرد این Timer با Timer اولی یکسانه، فقط هنگامی که قراره Callback Function مربوطه فراخوانی بشه، تایمر با استفاده از SynchronizingObject.Begin.Invoke اون Callback شما رو فراخوانی میکنه. SynchronizingObject یکی از Property های این Timer هستش که در Windows Form ها، بصورت پیش فرض، به فرم فعلی Assign میشه به این معنی که اجرای این تابع باید با اجرای فرم همزمان بشه. اما، دقت کنید، اما اگر این Property رو Set نکنیم، اونوقت Elapsed Handler مربوطه در یک Worker Thread اجرا میشه... پس فقط در حالتی که این Property رو Set کرده باشیم میتونیم به UI Object ها در Elapsed Handler دسترسی داشته باشیم؛ در غیر اینصورت، نباید هیچ Reference ای به UI Object ها داشته باشیم.
System.Threading.Timer نیز، همونطوریکه از Namespace اش مشخصه، اجازه ساخت Timer ای رو بهمون میده که Callback Function اش در Worker Thread ای دیگه ای اجرا خواهد شد. بنابراین اگر در Handler مربوطه نیاز به دستکاری UI Object ها داشته باشیم، باید خودمون با استفاده از Invoke یا BeginInvoke کنترل، دسترسی به UI Object ها رو Marshal کنیم.


طبیعتا بسته به نوع استفاده، باید Timer مناسب رو انتخاب کنید.


موفق باشید.