سلام
تاپیک عنوان ساده داشت وندیده بودم... عجب بحث داغی ایجاد شده :n02:
البته تمام پست های دوستان را نخواندم :n40:
الآن ساعت 0215 بامداد است و دارم p30world میخوانم
اگر بخواهم یک راه ساده ومطمئن را استفاده کنم و مدام هم به تداخل ریسمان و چند کلیک و... فکر نکنم احتمالا در نگاه اول کد زیر را خواهم نوشت ...
نگه داری یک عدد int به عنوان نسخه در پاره ای موارد مشابه کمک زیادی میکند، خود مایکروسافت هم در بخشی از کدهای داخلی Enumerable ها و مقابله با مشکلات چند ریسمانی از کدهای مشابه مفهوم version استفاده کرد. بطور معمول به عنوان بخشی از یک جور راه حل روتین قابل اعمال است و زیاد نیاز به فکر کردن به جنبه های مختلف ندارد.
کد:
using System;
using System.Threading;
namespace ... {
public class ... {
private int m_ClickVersion = 0;
private void OnNotifyIconClick(object sender, EventArgs e)
{
int version = Interlocked.Increment(ref this.m_ClickVersion);
ThreadPool.QueueUserWorkItem(_ =>
{
System.Threading.Thread.Sleep(500);
if (Interlocked.CompareExchange(ref this.m_ClickVersion, 0, 0) != version) return;
this.BeginInvoke(new Action(() =>
{
if (Interlocked.CompareExchange(ref this.m_ClickVersion, 0, 0) != version) return;
try
{
//TODO: add code for Click event ...
//System.Diagnostics.Debug.WriteLine("OnNotifyIconClick");
}
catch
{
//TODO: log
}
}));
});
}
private void OnNotifyIconDoubleClick(object sender, EventArgs e)
{
Interlocked.Increment(ref this.m_ClickVersion);
try
{
//TODO: add code for DoubleClick event ...
//System.Diagnostics.Debug.WriteLine("OnNotifyIconDoubleClick");
}
catch
{
//TODO: log
}
}
(زیاد هم نگران پرشدن int نباشید، اگر کاربر شما هر ثانیه یک کلیک کند و این کار را پیوسته بدون خواب وخوراک در 24 ساعت روز و 7 روز هفته و... ادامه دهد، 60 سال طول میکشد! برای ساعتی 100 کلیک مداوم 2000 سال و در عمل وبا اعداد واقعی چند هزار سالی طول میکشد!)
برای WPF همانطور که در کد دوستان بود بجای BeginInvoke باید از Dispatcher استفاده شود.
در خصوص volatile هم در مورد دسترسی به متغییر های ساده ای که مقدار مستقیم توسط ریسمان های متفاوت امکان تغییر دارد، بهتر است استفاده شود، مثال های ساده ای میتوان بیان کرد که استفاده وعدم استفاده تفاوت کاملا مشهود دارد ولی در نهایت تصمیم شرایط و محل واستفاده به عهده برنامه نویس ودر تخصص او است، به عنوان نمونه در کد فوق نباید استفاده شود و استفاده از کلاس Interlocked بسیار مناسب ومطمئن تر عمل میکند.
شب خوش.
:n11: