C# Programming Guide – Telegram
C# Programming Guide
193 subscribers
113 photos
9 videos
14 files
102 links
سلام دوستان در این کانال نکاتی در مورد مسائل پیشرفته در سی شارپ ارائه میشه که مربوط به بیش از 15 سال تجربه ی کاری من هست.
ممنون از اینکه دنبال میکنید.
اگر نکات خاصی به ذهنتون رسید با ادمین در میون بذارید
تماس با ادمین:
@Ali_Visual_Studio
Download Telegram
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading
1.کلید واژه های async و await چیست؟
2.کلاس هایDispatcher و SynchronizationContext چیست؟
C# Programming Guide
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading 1.کلید واژه های async و await چیست؟ 2.کلاس هایDispatcher و SynchronizationContext چیست؟
چون توضیحات و مسائلی که اینجا ارائه میکنم ترجمه شده و کپی شده نیست سعی میکنم تعریف های خودمونی تری ارائه کنم تا برای کسانی که یکم کار کردن هم قابل فهم باشه و فکر نکنن دارن کتاب اموزشی مطالعه میکنن که برن ده جای دیگه پرس و جو کنن تا مطلب رو متوجه بشن. هر کجا نا مفهومه یا نیاز به توضیح بیشتره به ادمین بگید تا براتون بیشتر توضیح بدم یا بازش کنم مطلب رو.
C# Programming Guide
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading 1.کلید واژه های async و await چیست؟ 2.کلاس هایDispatcher و SynchronizationContext چیست؟
اگر به ترجمه ی thread نگاه کنیم میبینیم که به معنی نخ یا رشته هست.ترد ها رو رشته هایی در نظر بگیرید که به یک نرم افزار متصل هستند و وظیفه ی انجام عملیات های خاصی رو دارن ترد ها به هم مربوط نمیشن مگر اینکه شما خودتون ارتباطی بینشون ایجاد کنید (پلی بزنید برای خوندن مقادیر یا ریختن مقادیر در حافظه).
نرم افزار هایی که مینویسید به طور پیشفرض وقتی اجرا میشن یک ترد بیشتر ندارن تا اینکه شما بهش ترد های مختلفی اضافه کنید.ترد ها وظیفه ی اجرای عملیات رو توی خودشون دارن و یک ترد قادر نیست دو عملیات رو با هم انجام بده. در واقع وقتی یک ترد busy و مشغول اجرای یک سری عملیات هست نمیتونید بهش بگید این عملیات رو هم برام انجام بده مگر اینکه کارش تموم بشه و یا اجرای عملیات رو به ترد دیگه ای بسپاره.برای همین هست که شما وقتی توی نرم افزار یک حلقه ی بی نهایت میذارید نرم افزار هنگ میکنه و Not Responding میشه.در واقع ترد UI نرم افزار مشغول میشه.
از نظر منطقی فکر کنید: آیا میتونید دو تا تابع رو توی متد Main همزمان اجرا کنید؟ دقیقا نمیشه چون خط های برنامه و نرم افزار شما باید پشت سر هم و خط به خط اجرا بشن.این کار رو ترد اصلی نرم افزار که موقع اجرای نرم افزار ساخته میشه به عهده داره.این از مبحث ترد ها حالا باید ببینیم چطوری میشه ترد های مختلفی ایجاد کرد یا کلید واژه ها و کلاس های بالا کاربردشون چیه؟
C# Programming Guide
Photo
یه مثال ساده هم میزنم که سریع ازش رد شیم توی مثال بالا متد Dowork توی یک نخ دیگه اجرا میشه و شما میتونید ببینید که قبل اینکه Dowork Started یا Dowork Finished اجرا بشه Write Text زودتر چاپ میشه و ترد اصلی شما منتظر نمیمونه تا تردی که ساختید کارش تموم بشه.
اگر میخواید منتظر بمونه بعد از خط thread.Start(); خط زیر رو اضافه کنید و میبینید که ترد اصلی شما جوین میشه به تردی که ساختید و منتظر میمونه تا اون کارش تموم بشه و بره خط بعدی:
thread.Join();
C# Programming Guide
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading 1.کلید واژه های async و await چیست؟ 2.کلاس هایDispatcher و SynchronizationContext چیست؟
کلاس های SynchronizationContext و Dispatcher:
در نظر داشته باشید که Dispatcher توی WPF استفاده میشه.
فرض کنید شما دارید یک فایلی رو توی ترد دیگه دانلود میکنید بعدش میخواید توی رابط کاربریprogressbar رو بروز رسانی کنید.خب شما از توی ترد دیگه نمیتونید به ترد UI دسترسی داشته باشید و با خطا مواجه میشید که دسترسی شما به ترد UI مقدور نیست. با Dispatcher میتونید قطعه کدی رو توی ترد UI اجرا کنید.
کلاس Dispatcher یکی از کلاس های مخصوص WPF و از کتابخانه ی WindowsBase هست ولی SynchronizationContext عمومی هست و توی کتاب خانه ی mscorlib هست که طرز کارش رو بهتون میگم.
C# Programming Guide
Photo
اگر ترد اصلی UI شما مشغول باشه Dispatcher.Invoke منتظر میمونه تا مشغولیتش تموم بشه بعد تابع شمارو توی ترد UI اجرا کنه همونطور که قبلا گفتم یک ترد نمیتونه دوتا کار رو همزمان انجام بده.برای اینکه این اتفاق رو توی صف بذارید که در پس زمینه هندل بشه میتونید از Dispatcher.BeginInvoke استفاده کنید.
C# Programming Guide
Photo
در واقع کد SynchronizationContext.Current توی هر تردی که باشه کانتکست اون ترد رو بر میگردونه که بتونید توش پست کنید.دقت کنید توی ترد هایی که شما تازه جدید میسازید SynchronizationContext.Current مقدار null داره و برای اینکه اونو ایجاد کنید باید از کد زیر استفاده کنید:
if (SynchronizationContext.Current == null)
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
C# Programming Guide
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading 1.کلید واژه های async و await چیست؟ 2.کلاس هایDispatcher و SynchronizationContext چیست؟
مبحث async و await :
اگر با سی شارپ کار کرده باشید (دات نت 4.5 به بعد) باید دیده باشید که برخی از توابع خروجی Task دارن و کنارش توی پرانتزش نوشته (awaitable) یعنی async و await رو پشتیبانی میکنن.
همچنین async و await به شما کمک میکنن کدهاتون رو توی ترد های دیگه اجرا کنید بدون اینکه توی delegate خاصی خروجی بدید بتونید توی خط بعد خروجی رو بگیرید و بدون اینکه از Dispatcher استفاده کنید رابط کاربری رو تغییر بدید.
C# Programming Guide
Photo
نمونه ی بالا یک نمونه ساده از async و await هست که بدون اینکه رابط کاربری شما هنگ کنه بعد از 3 ثانیه پروگرس بار 100 درصد میشه و یک پیغام نمایش داده میشه.
C# Programming Guide
Photo
توی مثال بالا من یک Task با زمان توقف 1 ثانیه ایجاد کردم و تا عدد 100 میره و در این حالت شما میتونید روی دکمه کلیک کنید و ببینید که نرم هست و هیچ هنگی ای توش نیست و نرم افزار هم براحتی کار میکنه. چون Thread.Sleep توی یک ترد دیگه اجرا میشه و await منتظر میمونه تا کارش تموم بشه و بعدش پروگرسبار شما توی ترد اصلی اپدیت میشه. از Task.Delay استفاده نکردم تا بیشتر مفهوم کارش رو متوجه بشید و خودتون بتونید یک تابع awaitable ایجاد کنید.
C# Programming Guide
توی مثال بالا من یک Task با زمان توقف 1 ثانیه ایجاد کردم و تا عدد 100 میره و در این حالت شما میتونید روی دکمه کلیک کنید و ببینید که نرم هست و هیچ هنگی ای توش نیست و نرم افزار هم براحتی کار میکنه. چون Thread.Sleep توی یک ترد دیگه اجرا میشه و await منتظر میمونه…
اگر شما Task و async و await هارو بردارید نرم افزار شما حدود 100 ثانیه تو حالت هنگ میمونه.چون Thread.Sleep توی ترد UI (رابط کاربری) اجرا میشه و نرم افزار شما Freez میشه و دیگه نمیتونید چیزی ببینید یا روی دکمه ای کلیک کنید البته چون تابع Run توی Constructor هست برنامه ی شما 100 ثانیه بعد بالا خواهد اومد.