C# Programming Guide
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading 1.کلید واژه های async و await چیست؟ 2.کلاس هایDispatcher و SynchronizationContext چیست؟
کلاس های SynchronizationContext و Dispatcher:
در نظر داشته باشید که Dispatcher توی WPF استفاده میشه.
فرض کنید شما دارید یک فایلی رو توی ترد دیگه دانلود میکنید بعدش میخواید توی رابط کاربریprogressbar رو بروز رسانی کنید.خب شما از توی ترد دیگه نمیتونید به ترد UI دسترسی داشته باشید و با خطا مواجه میشید که دسترسی شما به ترد UI مقدور نیست. با Dispatcher میتونید قطعه کدی رو توی ترد UI اجرا کنید.
در نظر داشته باشید که 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());
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 استفاده کنید رابط کاربری رو تغییر بدید.
اگر با سی شارپ کار کرده باشید (دات نت 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 ثانیه بعد بالا خواهد اومد.
برای اینکه async و await رو توی دات نت 4.0 داشته باشید باید پکیج Microsoft.Bcl.Async رو توی پروژتون اضافه کنید.
پکیج هارو هم از طریق پنجره ی Package Manager توی ویژوال استادیو براحتی میتونید پیدا کنید و نصب کنید.
روی پروژه راست کلیک کنید و Manage Nuget Packages رو بزنید و از تب Browse پکیج مورد نظر رو جستجو کنید و نصب کنید.
#آموزش
#پکیج
#Package_Manager
#Package
پکیج هارو هم از طریق پنجره ی Package Manager توی ویژوال استادیو براحتی میتونید پیدا کنید و نصب کنید.
روی پروژه راست کلیک کنید و Manage Nuget Packages رو بزنید و از تب Browse پکیج مورد نظر رو جستجو کنید و نصب کنید.
#آموزش
#پکیج
#Package_Manager
#Package
کلید واژه های virtual و override چیست و اصلا چرا ما باید از اینا استفاده کنیم؟ کاربردشون چه زمانی واقعا نیاز میشه؟
C# Programming Guide
کلید واژه های virtual و override چیست و اصلا چرا ما باید از اینا استفاده کنیم؟ کاربردشون چه زمانی واقعا نیاز میشه؟
توی این مثالی که میزنم یکم بیشتر مفهوم استفاده از این کلید واژه ها رو متوجه خواهید شد:
همونطور که میدونید یه سری کد های سیستم عاملی مخصوص اون سیستم عامل هستند و قابلیت اجرا توی سیستم عامل های دیگه رو ندارن مثلا شما توی ویندوز وقتی میخواید پنجره ای رو به کاربر نشون بدید که یک محل ذخیره و یک پوشه رو انتخاب کنه از کلاس FolderBrowserDialog استفاده میکنید ولی نمیتونید از این کلاس توی اندروید استفاده کنید چون این کلاس مخصوص سیستم عامل ویندوز و از توابع API خود ویندوز استفاده میکنه و نمیتونید از اون توی اندروید استفاده کنید چون توابع سیستم عامل ها شبیه هم نیستند و از پایه سیستمشون با هم فرق میکنه یا به عبارتی سیستم عامل ها نرم افزار های متفاوتی نسبت به هم هستند و حتی توی کامپایل به خطا خواهید خورد.
فرض کنید کلاسی دارید که یه سری آدرس های انتخاب شده توسط کاربر توش ذخیره میشه (مثلا محل ذخیره ی تنظیمات نرم افزارتون) و یه سری داده هایی توی این کلاس هست که توی تمام سیستم عامل ها یکسان هستند و توسط کاربر انتخاب میشن مثلا یک String از آدرس محل ذخیره ی انتخاب شده توسط کاربر و ...
حالا شما نمیخواهید قسمت هسته ی کلاس رو دوباره سازی کنید بلکه فقط میخواهید قسمت هایی که مخصوص سیستم عامل های دیگه هست رو مجدد پیاده سازی کنید.و میخواهید هنگامی که متغیر SaveAddress فراخونی شد و مقدارش خالی بود به کلاس کاربر بگید که ادرس رو از کاربر بگیره و توش ذخیره کنه.
توی این حالت کلید واژه های virtual و override به کمک شما میان.
همونطور که میدونید یه سری کد های سیستم عاملی مخصوص اون سیستم عامل هستند و قابلیت اجرا توی سیستم عامل های دیگه رو ندارن مثلا شما توی ویندوز وقتی میخواید پنجره ای رو به کاربر نشون بدید که یک محل ذخیره و یک پوشه رو انتخاب کنه از کلاس FolderBrowserDialog استفاده میکنید ولی نمیتونید از این کلاس توی اندروید استفاده کنید چون این کلاس مخصوص سیستم عامل ویندوز و از توابع API خود ویندوز استفاده میکنه و نمیتونید از اون توی اندروید استفاده کنید چون توابع سیستم عامل ها شبیه هم نیستند و از پایه سیستمشون با هم فرق میکنه یا به عبارتی سیستم عامل ها نرم افزار های متفاوتی نسبت به هم هستند و حتی توی کامپایل به خطا خواهید خورد.
فرض کنید کلاسی دارید که یه سری آدرس های انتخاب شده توسط کاربر توش ذخیره میشه (مثلا محل ذخیره ی تنظیمات نرم افزارتون) و یه سری داده هایی توی این کلاس هست که توی تمام سیستم عامل ها یکسان هستند و توسط کاربر انتخاب میشن مثلا یک String از آدرس محل ذخیره ی انتخاب شده توسط کاربر و ...
حالا شما نمیخواهید قسمت هسته ی کلاس رو دوباره سازی کنید بلکه فقط میخواهید قسمت هایی که مخصوص سیستم عامل های دیگه هست رو مجدد پیاده سازی کنید.و میخواهید هنگامی که متغیر SaveAddress فراخونی شد و مقدارش خالی بود به کلاس کاربر بگید که ادرس رو از کاربر بگیره و توش ذخیره کنه.
توی این حالت کلید واژه های virtual و override به کمک شما میان.
C# Programming Guide
Photo
توی مثال بالا من سه تا کلاس ساختم:
1. کلاس BrowserCore که همون کلاس مشترک بین دو سیستم عامل ویندوز و اندروید هست و نمیخواهید متغیرهاش کپی بشه و دوباره نویسی کنید این کلاس رو یک بار مینویسید و توی همه ی سیستم عامل ها استفاده میشه.همچنین باید در نظر داشته باشید که کار های مشترک بین دو سیستم عامل رو در این کلاس ها باید بنویسید و مثلا کدهای مخصوص ویندوز رو توش ننویسید که توی اندروید اجرا یا کامپایل نمیشه.مسائل مربوط به برنامه نویسی کراس پلتفرم هست که در اینده بیشتر باهاش اشنا میشیم.
2.کلاس AndroidBrowser که کد های مخصوص اندروید رو توش مینویسم که توی سیستم عامل های دیگه قابل اجرا نیست.
3.کلاس WindowsBrowser که کد های مخصوص ویندوز رو توش مینویسیم که توی سیستم عامل های دیگه قابل اجرا نیست.
نکته:در حال حاضر من از کلاس FolderBrowserDialog برای ویندوز استفاده نکردم بیشتر خواستم مفهوم استفاده از اینها رو متوجه بشید.
1. کلاس BrowserCore که همون کلاس مشترک بین دو سیستم عامل ویندوز و اندروید هست و نمیخواهید متغیرهاش کپی بشه و دوباره نویسی کنید این کلاس رو یک بار مینویسید و توی همه ی سیستم عامل ها استفاده میشه.همچنین باید در نظر داشته باشید که کار های مشترک بین دو سیستم عامل رو در این کلاس ها باید بنویسید و مثلا کدهای مخصوص ویندوز رو توش ننویسید که توی اندروید اجرا یا کامپایل نمیشه.مسائل مربوط به برنامه نویسی کراس پلتفرم هست که در اینده بیشتر باهاش اشنا میشیم.
2.کلاس AndroidBrowser که کد های مخصوص اندروید رو توش مینویسم که توی سیستم عامل های دیگه قابل اجرا نیست.
3.کلاس WindowsBrowser که کد های مخصوص ویندوز رو توش مینویسیم که توی سیستم عامل های دیگه قابل اجرا نیست.
نکته:در حال حاضر من از کلاس FolderBrowserDialog برای ویندوز استفاده نکردم بیشتر خواستم مفهوم استفاده از اینها رو متوجه بشید.