C# Programming Guide
Photo
فرض کنید میخواید یه سری داده رو با خروجی کلاس MessageContract از سرور به کلاینت بفرستید و نمیخواهید همیشه MessageContract رو توی بازگشتی خطا ها همش new کنید و مقادیرش رو پر کنید، بلکه فقط میخواهید یک String رو return کنید ولی خروجیش از نوع MessageContract ای باشه که Success نیست و خطا هست.
توی تابع بالا خروجی تابع شما از نوع MessageContract هست ولی شما یک string رو return کردید implicit ها به شما کمک میکنن تا یک مقدار رو از پیش و کد کمتر و تمییز تر خروجی بدید و هر بار اونو مجدد باز سازی نکنید تا کد هاتون شلوغ نشه یا به عبارت دیگه باعث میشه تا شما انواع داده ها و کلاس ها رو به هم تبدیل کنید.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit
توی تابع بالا خروجی تابع شما از نوع MessageContract هست ولی شما یک string رو return کردید implicit ها به شما کمک میکنن تا یک مقدار رو از پیش و کد کمتر و تمییز تر خروجی بدید و هر بار اونو مجدد باز سازی نکنید تا کد هاتون شلوغ نشه یا به عبارت دیگه باعث میشه تا شما انواع داده ها و کلاس ها رو به هم تبدیل کنید.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit
Docs
User-defined conversion operators - C# reference
Learn how to define custom implicit and explicit type conversions in C#.
C# Programming Guide
فرض کنید میخواید یه سری داده رو با خروجی کلاس MessageContract از سرور به کلاینت بفرستید و نمیخواهید همیشه MessageContract رو توی بازگشتی خطا ها همش new کنید و مقادیرش رو پر کنید، بلکه فقط میخواهید یک String رو return کنید ولی خروجیش از نوع MessageContract…
Program.cs
1 KB
implicit sample
C# Programming Guide
فرض کنید میخواید یه سری داده رو با خروجی کلاس MessageContract از سرور به کلاینت بفرستید و نمیخواهید همیشه MessageContract رو توی بازگشتی خطا ها همش new کنید و مقادیرش رو پر کنید، بلکه فقط میخواهید یک String رو return کنید ولی خروجیش از نوع MessageContract…
توی کلاس مورد نظرتون شما میتونید هرچندتا که میخواهید از هر نوع خروجی مثلا (enum) هم implicit بسازید و توی تابع خودتون هم String خروجی بدید و هم enum و در هر دو صورت توابع implicit شما فراخونی شده و string یا enum شما تبدیل به MessageContract یا کلاس مورد نظر شما میشن.
C# Programming Guide
Photo
فرض کنید کلاس MessageContract شما در یک کامپوننتی قرار دارد که شما به سورس ان دسترسی ندارید یا دسترسی به ان سخت است، ولی شما میخواهید یک تابع برای ان بنویسید، یا بالعکس شما میخواهید برای کلاس string یک تابع بنویسید که بتوانید از ان خروجی MessageContract بگیرید (مثال بالا) شما میتوانید از توابع Extension استفاده کنید. توابع Extension باید static باشند و در کلاس static قرار گرفته باشند.در مثال بالا Success یک تابع Extension است.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
Docs
Extension Methods - C#
Extension methods in C# enable you to add methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.
C# Programming Guide
Photo
در برنامه های مالتی ترد دسترسی به مقادر متغیر ها برای خواندن و نوشتن از حساسیت ویژه ای برخوردار هست، شما فرض کنید دو ترد یا دو core از سی پی یو میخوان مقدار یک متغیر رو بخونن یا توش write کنن، چه اتفاقی میوفته؟ مسلما اگر همزمان اتفاق بیوفته یکی از ترد ها ناتوان هست در اینکه بخواد مقدار رو write کنه.
در واقع استفاده از دستور lock در برنامه های مالتی ترد این امکان رو برای برنامه نویس فراهم میکنه تا به برنامه اجازه نده ترد ها به صورت همزمان از یک متغیر بخونن یا توی اون مقدار بریزن.در این صورت شما میتونید از کلید واژه ی volatile استفاده کنید تا این اتفاق نیوفته.توی کد بالا در حالت ریلیز وقتی شما کلاس رو Dispose کنید مقدار _IsDispose برابر با True نمیشه چون حلقه ی while همیشه در حال خوندن مقدار متغیر _isDispose هست و همزمانی پیش میاد، یعنی برنامه ی شما نمیتونه توی متغیر چیزی بریزه در نتیجه برنامه هرگز به پایان نمیرسه و این باعث بوجود اومدن یک باگ بزرگ توی اپ شما میشه.
پس در نظر داشته باشید توی برنامه های مالتی ترد متغیر هاتون رو volatile تعریف کنید یا از کلید واژه ی lock هم میتونید استفاده کنید.
برای متغیر های long و double و ... نمیتونید از کلید واژه ی volatile استفاده کنید در نتیجه میتونید از Thread.VolatileRead یا Thread.VolatileWrite برای خواندن و نوشتن توی متغیر استفاده کنید.
در واقع استفاده از دستور lock در برنامه های مالتی ترد این امکان رو برای برنامه نویس فراهم میکنه تا به برنامه اجازه نده ترد ها به صورت همزمان از یک متغیر بخونن یا توی اون مقدار بریزن.در این صورت شما میتونید از کلید واژه ی volatile استفاده کنید تا این اتفاق نیوفته.توی کد بالا در حالت ریلیز وقتی شما کلاس رو Dispose کنید مقدار _IsDispose برابر با True نمیشه چون حلقه ی while همیشه در حال خوندن مقدار متغیر _isDispose هست و همزمانی پیش میاد، یعنی برنامه ی شما نمیتونه توی متغیر چیزی بریزه در نتیجه برنامه هرگز به پایان نمیرسه و این باعث بوجود اومدن یک باگ بزرگ توی اپ شما میشه.
پس در نظر داشته باشید توی برنامه های مالتی ترد متغیر هاتون رو volatile تعریف کنید یا از کلید واژه ی lock هم میتونید استفاده کنید.
برای متغیر های long و double و ... نمیتونید از کلید واژه ی volatile استفاده کنید در نتیجه میتونید از Thread.VolatileRead یا Thread.VolatileWrite برای خواندن و نوشتن توی متغیر استفاده کنید.
C# Programming Guide
در برنامه های مالتی ترد دسترسی به مقادر متغیر ها برای خواندن و نوشتن از حساسیت ویژه ای برخوردار هست، شما فرض کنید دو ترد یا دو core از سی پی یو میخوان مقدار یک متغیر رو بخونن یا توش write کنن، چه اتفاقی میوفته؟ مسلما اگر همزمان اتفاق بیوفته یکی از ترد ها ناتوان…
Program.cs
983 B
موضوع: برنامه نویسی مالتی تردینگ - Multi Treading
1.کلید واژه های async و await چیست؟
2.کلاس هایDispatcher و SynchronizationContext چیست؟
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 همزمان اجرا کنید؟ دقیقا نمیشه چون خط های برنامه و نرم افزار شما باید پشت سر هم و خط به خط اجرا بشن.این کار رو ترد اصلی نرم افزار که موقع اجرای نرم افزار ساخته میشه به عهده داره.این از مبحث ترد ها حالا باید ببینیم چطوری میشه ترد های مختلفی ایجاد کرد یا کلید واژه ها و کلاس های بالا کاربردشون چیه؟
نرم افزار هایی که مینویسید به طور پیشفرض وقتی اجرا میشن یک ترد بیشتر ندارن تا اینکه شما بهش ترد های مختلفی اضافه کنید.ترد ها وظیفه ی اجرای عملیات رو توی خودشون دارن و یک ترد قادر نیست دو عملیات رو با هم انجام بده. در واقع وقتی یک ترد busy و مشغول اجرای یک سری عملیات هست نمیتونید بهش بگید این عملیات رو هم برام انجام بده مگر اینکه کارش تموم بشه و یا اجرای عملیات رو به ترد دیگه ای بسپاره.برای همین هست که شما وقتی توی نرم افزار یک حلقه ی بی نهایت میذارید نرم افزار هنگ میکنه و Not Responding میشه.در واقع ترد UI نرم افزار مشغول میشه.
از نظر منطقی فکر کنید: آیا میتونید دو تا تابع رو توی متد Main همزمان اجرا کنید؟ دقیقا نمیشه چون خط های برنامه و نرم افزار شما باید پشت سر هم و خط به خط اجرا بشن.این کار رو ترد اصلی نرم افزار که موقع اجرای نرم افزار ساخته میشه به عهده داره.این از مبحث ترد ها حالا باید ببینیم چطوری میشه ترد های مختلفی ایجاد کرد یا کلید واژه ها و کلاس های بالا کاربردشون چیه؟
C# Programming Guide
اگر به ترجمه ی thread نگاه کنیم میبینیم که به معنی نخ یا رشته هست.ترد ها رو رشته هایی در نظر بگیرید که به یک نرم افزار متصل هستند و وظیفه ی انجام عملیات های خاصی رو دارن ترد ها به هم مربوط نمیشن مگر اینکه شما خودتون ارتباطی بینشون ایجاد کنید (پلی بزنید برای…
مبحث تردینگ در سایت مایکروسافت و اموزش ایجاد انواع ترد را در لینک زیر مطالعه کنید:
https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
C# Programming Guide
Photo
یه مثال ساده هم میزنم که سریع ازش رد شیم توی مثال بالا متد Dowork توی یک نخ دیگه اجرا میشه و شما میتونید ببینید که قبل اینکه Dowork Started یا Dowork Finished اجرا بشه Write Text زودتر چاپ میشه و ترد اصلی شما منتظر نمیمونه تا تردی که ساختید کارش تموم بشه.
اگر میخواید منتظر بمونه بعد از خط thread.Start(); خط زیر رو اضافه کنید و میبینید که ترد اصلی شما جوین میشه به تردی که ساختید و منتظر میمونه تا اون کارش تموم بشه و بره خط بعدی:
thread.Join();
اگر میخواید منتظر بمونه بعد از خط 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 استفاده میشه.
فرض کنید شما دارید یک فایلی رو توی ترد دیگه دانلود میکنید بعدش میخواید توی رابط کاربریprogressbar رو بروز رسانی کنید.خب شما از توی ترد دیگه نمیتونید به ترد UI دسترسی داشته باشید و با خطا مواجه میشید که دسترسی شما به ترد UI مقدور نیست. با Dispatcher میتونید قطعه کدی رو توی ترد UI اجرا کنید.