سیگنالگو 5.7 به همراه افزونه ی ویژوال استادیو 2022 منتشر شد.
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
امکانات اضافه شده به این نسخه:
1.توانایی ایجاد فایروال شخصی سازی شده
2.اضافه شدن قابلیت Key و PerSession به ConcurrentLockAttribute که توسط نوع Key شما می تونید بر اساس یک کلید خاصی لاک رو روی متد سرویس اعمال کنید و بر اساس PerSession به دو صورت میتونید لاک رو روی متد اعمال کنید.یک بر اساس سشن کاربر که یعنی فقط برای خود همون کاربر لاک انجام میشه دوم اگر مقدار Key رو با نام یکی از پارامتر های ورودی پر کنید لاک روی متد بر اساس سشن کاربر و مقدار ورودی که به پارامتر ارسال شده انجام میشه.کاربرد دومی خیلی ملموسه که موقع خرید کاربر نمی خواهید بقیه ی کاربرا منتظر و تو صف باشن ولی میخواهید اگر همون کاربر با همون ورودی دوبار متد رو صدا زد بره تو صف خودش 😉 کاربردش توی جلوگیری از عملیات همزمان موقع خرید کاربر هست و باعث میشه بقیه ی کاربرا به خاطر اون کاربر تو صف نباشن و فقط همون کاربر اگر متد رو دوبار همزمان صدا زد خودش فقط بره تو صف و کاراش تو صف انجام بشه
3.اضافه شدن فانکشن OnSendResponseToClientFunction که باهاش می تونید تمامی خروجی ها رو قبل از اینکه به سمت کلاینت برسه بررسی کنید یا تغییر بدید.
4.ساپورت gzip
#signalgo
@CsharpTips
Forwarded from کدهک
#برنامه_نویس عزیزم، آیا میدونستی اگر #کد_تمیز بزنی توانایی این رو داری که در مصرف #برق شهر و کشورت #صرف_جویی کنی؟
چطوری؟
#کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند.
به همین علت اگر کدهاتون رو تمیز و #بهینه بزنید و البته بدونید چه متغیر هایی رو چه جاهایی استفاده کنید که مصرف کامپیوتر یا گوشی یا هر دستگاهی رو کاهش بدید عملا باعث شدید اون دستگاه برق کمتری رو مصرف کنه.
پس دوست برنامه نویس عزیزم برای پایین آوردن مصرف برق شهر و کشورت هم که شده شما با بهینه کد زدن توانایی این رو داری که میزان اسراف رو کم کنی و کارهایی انجام بدی که حتی نمیدونی به چه جاهایی بعدا کمک خواهد کرد.
یوسفی
چطوری؟
#کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند.
به همین علت اگر کدهاتون رو تمیز و #بهینه بزنید و البته بدونید چه متغیر هایی رو چه جاهایی استفاده کنید که مصرف کامپیوتر یا گوشی یا هر دستگاهی رو کاهش بدید عملا باعث شدید اون دستگاه برق کمتری رو مصرف کنه.
پس دوست برنامه نویس عزیزم برای پایین آوردن مصرف برق شهر و کشورت هم که شده شما با بهینه کد زدن توانایی این رو داری که میزان اسراف رو کم کنی و کارهایی انجام بدی که حتی نمیدونی به چه جاهایی بعدا کمک خواهد کرد.
یوسفی
C# Programming Guide
#برنامه_نویس عزیزم، آیا میدونستی اگر #کد_تمیز بزنی توانایی این رو داری که در مصرف #برق شهر و کشورت #صرف_جویی کنی؟ چطوری؟ #کامپیوتر ها و #گوشی ها و #دستگاه هایی که با عملیات پردازشی در ارتباط هستند به ازای #پردازش بیشتر، برق بیشتری مصرف می کنند. به همین علت…
جهت شفافیت بیشتر که چرا هم کد تمیز و هم کد بهینه باعث کاهش مصرف انرژی میشن:
اجازه بدید یک مثال ملموس بزنم تا متوجه بشیم که کد تمیز ربطی به مصرف انرژی داره یا نه؟ و علت اینکه چرا توی پست هم اشاره به کد تمیز شده و هم اشاره به کد بهینه.
وقتی شما کد تمیز میزنید در طی زمان طولانی وقتی برمیگردید و میخواهید کدهاتون رو توسعه بدید سریعتر میتونید کد رو بخونید، تحلیل کنید و توسعه بدید یا رفع باگ کنید، اینجا یک مولفه ای وجود داره به نام زمان.
اگر شما ساعتی صد هزارتومان حقوق دریافت کنید، کد های تمیز، وقت و زمان و انرژی کمتری از شما میگیرن تا فیچر های جدید اضافه بشن یا باگ ها رفع بشن، اما اگر کد ها کثیف باشن شما به جای یک ساعت ممکنه ده ساعت وقت بذارید بناراین شما به جای صدهزار تومان در واقع 1 میلیون تومان براتون هزینه داشته تا اون فیچر و اون باگ رو رفع کنید (فقط بخاطر اینکه کد ها ناخوانا بودن و اصلا بهینه بودن اینجا مطرح نیست) که بر حسب ساعت کاری براتون حساب میشه پس زمان بیشتری از شما گرفته.
همچنین در مصرف هزینه های کارفرما صرف جویی میشه، وقتی شما در مصرف هزینه ها صرف جویی کنید اتوماتیکوار مصرف انرژی رو کاهش دادید چون برای بدست آوردن اون پول ها انرژی زیادی مصرف شده و پول ها بدون مصرف انرژی تولید نمی شن
امیدوارم صریح و شفاف گفته باشم که چطور کد تمیز و کد بهینه باعث کاهش مصرف انرژی میشن
اجازه بدید یک مثال ملموس بزنم تا متوجه بشیم که کد تمیز ربطی به مصرف انرژی داره یا نه؟ و علت اینکه چرا توی پست هم اشاره به کد تمیز شده و هم اشاره به کد بهینه.
وقتی شما کد تمیز میزنید در طی زمان طولانی وقتی برمیگردید و میخواهید کدهاتون رو توسعه بدید سریعتر میتونید کد رو بخونید، تحلیل کنید و توسعه بدید یا رفع باگ کنید، اینجا یک مولفه ای وجود داره به نام زمان.
اگر شما ساعتی صد هزارتومان حقوق دریافت کنید، کد های تمیز، وقت و زمان و انرژی کمتری از شما میگیرن تا فیچر های جدید اضافه بشن یا باگ ها رفع بشن، اما اگر کد ها کثیف باشن شما به جای یک ساعت ممکنه ده ساعت وقت بذارید بناراین شما به جای صدهزار تومان در واقع 1 میلیون تومان براتون هزینه داشته تا اون فیچر و اون باگ رو رفع کنید (فقط بخاطر اینکه کد ها ناخوانا بودن و اصلا بهینه بودن اینجا مطرح نیست) که بر حسب ساعت کاری براتون حساب میشه پس زمان بیشتری از شما گرفته.
همچنین در مصرف هزینه های کارفرما صرف جویی میشه، وقتی شما در مصرف هزینه ها صرف جویی کنید اتوماتیکوار مصرف انرژی رو کاهش دادید چون برای بدست آوردن اون پول ها انرژی زیادی مصرف شده و پول ها بدون مصرف انرژی تولید نمی شن
امیدوارم صریح و شفاف گفته باشم که چطور کد تمیز و کد بهینه باعث کاهش مصرف انرژی میشن
#تریدآف
#Tradeoff
یکی از واژه هایی که از سنیور ها می شنوید و احتمالا خیلی زیاد به گوشتون خورده، از این واژه وقتی استفاده میشه که برنامه نویس به این باور رسیده که راه چاره ای نداره و نمیتونه دوتا چیز رو همزمان در پروژه اش داشته باشه، یکی از این مسائل پرفورمنس به همراه کد تمیزه.
برنامه نویس های مجرب به این باور رسیدن که نمیشه هم پرفورمنس بالایی داشت و هم کد تمیز داشت، من میخوام امروز به این موضوع بپردازم که چقدر این حرف درسته و آیا دلیل موجهی برای اثباتش دارم یا خیر؟
من معتقدم استفاده از کلمه ی تریدآف فقط به این معنیه که من برنامه نویس تا همینجا علمش رو داشتم، بیشتر از این نمی تونم کمکتون کنم و از نظر اعتقادی باور کرده که نمیشه این دوتا چیز رو همزمان داشت اما آیا اون اعتقاد درسته؟ همیشه یه راه سومی وجود داره و اگر به ذهنتون نرسیده دلیل بر این نیست که وجود نداره باید باور کنیم ما علامه و عالم به همه چیز نیستیم ما بر این باوریم که همیشه میشه بهتر فکر کرد و راه های بهتری پیدا کرد برای همین دیدگاه هست که علم پیشرفت میکنه چون یه عده مخالف گوشی های دکمه ای بودن و فکر میکردن که باید راه بهتری باشه پس گوشی های لمسی رو اختراع کردن. بنابراین ذهن خودتون رو بسته نگه ندارید و نذارید به این موضوع باور کنید که شما همه چیز رو درست میگید، اگر به این باور رسیدید دروازه های پیشرفت و خلاقیت رو به روی ذهن خودتون بستید.
خب بریم سراغ اینکه من چطوری میخوام این موضوع رو اثبات کنم؟
همه میدونیم grpc خیلی سریعه و messagepack هم همینطور، اما هر دوی اینها قسمتی از کدهای شمارو کثیف میکنن و وابستگی به پروژه ی شما اضافه میکنن.
چطور؟
توی grpc شما حتما باید protobuf بسازید، فایل هایی که خروجی و ورودی سرویس ها و پروپرتی مدل های شمارو برای سریالایز و دیسریالایز مشخص میکنن.پس وابستگی grpc به پروژه های شما شد این فایل هایی که همه جا همراه شما میان.چرا grpc به همچین فایل هایی احتیاج داره؟
چون grpc وقتی داده هارو سریالایز میکنه مثل json اطلاعات پروپرتی کلاس ها و نام پروپرتی ها رو و مرتب سازی اونها رو توی داده هایی که رد و بدل می کنه نگهداری نمی کنه به همین واسطه نیاز داره که از شما نحوه مرتب سازی پروپرتی ها و نام هاشون رو داشته باشه تا اگر حذفشون کردید یا تغییر نامشون دادید بتونه دیسریالایزشون کنه.
توی messagepack هم به همین شکله، چیزی به نام protobuf نداره ولی بالای پروپرتی های کلاس هاتون باید کلی اتریبیوت بذارید که ایندکسش رو مشخص کنید.
خب من پکیجی ساختم به نام BinaryGo که توی گیتهابم هست، این پکیج نه protobuf داره و نه لازمه بالای کلاسهاتون attribute بذارید در عین حال نزدیک به دوبرابر از grpc و messagepack سریعتره.این یعنی کد تمیزی برای شما به وجود میاره و در عین حال پرفورمنس بیشتری داره.
حالا از این به بعد اگر کسی به شما گفت این قضیه تریدآف داره و نمیشه کد تمیز داشت و بهینه هم باشه تنها یک جمله بهش بگید: مهندس نگو نمیشه، بگو من علمش رو ندارم یا نمی دونم.
#Tradeoff
یکی از واژه هایی که از سنیور ها می شنوید و احتمالا خیلی زیاد به گوشتون خورده، از این واژه وقتی استفاده میشه که برنامه نویس به این باور رسیده که راه چاره ای نداره و نمیتونه دوتا چیز رو همزمان در پروژه اش داشته باشه، یکی از این مسائل پرفورمنس به همراه کد تمیزه.
برنامه نویس های مجرب به این باور رسیدن که نمیشه هم پرفورمنس بالایی داشت و هم کد تمیز داشت، من میخوام امروز به این موضوع بپردازم که چقدر این حرف درسته و آیا دلیل موجهی برای اثباتش دارم یا خیر؟
من معتقدم استفاده از کلمه ی تریدآف فقط به این معنیه که من برنامه نویس تا همینجا علمش رو داشتم، بیشتر از این نمی تونم کمکتون کنم و از نظر اعتقادی باور کرده که نمیشه این دوتا چیز رو همزمان داشت اما آیا اون اعتقاد درسته؟ همیشه یه راه سومی وجود داره و اگر به ذهنتون نرسیده دلیل بر این نیست که وجود نداره باید باور کنیم ما علامه و عالم به همه چیز نیستیم ما بر این باوریم که همیشه میشه بهتر فکر کرد و راه های بهتری پیدا کرد برای همین دیدگاه هست که علم پیشرفت میکنه چون یه عده مخالف گوشی های دکمه ای بودن و فکر میکردن که باید راه بهتری باشه پس گوشی های لمسی رو اختراع کردن. بنابراین ذهن خودتون رو بسته نگه ندارید و نذارید به این موضوع باور کنید که شما همه چیز رو درست میگید، اگر به این باور رسیدید دروازه های پیشرفت و خلاقیت رو به روی ذهن خودتون بستید.
خب بریم سراغ اینکه من چطوری میخوام این موضوع رو اثبات کنم؟
همه میدونیم grpc خیلی سریعه و messagepack هم همینطور، اما هر دوی اینها قسمتی از کدهای شمارو کثیف میکنن و وابستگی به پروژه ی شما اضافه میکنن.
چطور؟
توی grpc شما حتما باید protobuf بسازید، فایل هایی که خروجی و ورودی سرویس ها و پروپرتی مدل های شمارو برای سریالایز و دیسریالایز مشخص میکنن.پس وابستگی grpc به پروژه های شما شد این فایل هایی که همه جا همراه شما میان.چرا grpc به همچین فایل هایی احتیاج داره؟
چون grpc وقتی داده هارو سریالایز میکنه مثل json اطلاعات پروپرتی کلاس ها و نام پروپرتی ها رو و مرتب سازی اونها رو توی داده هایی که رد و بدل می کنه نگهداری نمی کنه به همین واسطه نیاز داره که از شما نحوه مرتب سازی پروپرتی ها و نام هاشون رو داشته باشه تا اگر حذفشون کردید یا تغییر نامشون دادید بتونه دیسریالایزشون کنه.
توی messagepack هم به همین شکله، چیزی به نام protobuf نداره ولی بالای پروپرتی های کلاس هاتون باید کلی اتریبیوت بذارید که ایندکسش رو مشخص کنید.
خب من پکیجی ساختم به نام BinaryGo که توی گیتهابم هست، این پکیج نه protobuf داره و نه لازمه بالای کلاسهاتون attribute بذارید در عین حال نزدیک به دوبرابر از grpc و messagepack سریعتره.این یعنی کد تمیزی برای شما به وجود میاره و در عین حال پرفورمنس بیشتری داره.
حالا از این به بعد اگر کسی به شما گفت این قضیه تریدآف داره و نمیشه کد تمیز داشت و بهینه هم باشه تنها یک جمله بهش بگید: مهندس نگو نمیشه، بگو من علمش رو ندارم یا نمی دونم.
دانلود منیجر آگرین اوپن سورس شد!
دانلود منیجر آگرین نرم افزاری بود که از سال 2012 شروع به پیاده سازی اون کردم و تا همین چند سال پیش به عنوان یک پروژه فردی توسعه داده شد.این یک پروژه ی #شکست_خورده هست چون من نتونستم ایده هایی که میخواستم رو کامل توش پیاده سازی کنم، دانلود از یوتیوب شروع خوبی برام بود تازه داشتم به درآمد خوبی می رسیدم شاید امروز اوضاعم خیلی فرق میکرد ولی به خاطر این قابلیت توسط #کافه_بازار حذف شد و من انگیزم کامل از بین رفت!
اما امروز اونو اپن سورس کردم تا توسعه دهندگانی که میخوان توی عرصه ی نرم افزارهای ویندوز و موبایل کار کنن شاید این سورس بتونه کمک حالشون باشه.
اون قدیما توی سال 2012 یه فرومی بود که من توش تاپیک زده بود در مورد توسعه ی این دانلود منیجر که هنوز موجوده:
http://forum.p30world.com/showthread.php?t=556052
وبلاگ رسمیش اون قدیما:
http://framework.blogfa.com/
از قابلیت های این نرم افزار مسائل زیر بود:
1.دانلود انواع فایل ها روی گوشی های اندروید و ویندوز
2.قابلیت دانلود با زمانبندی
3.گروه بندی
4.دانلود از آپارات،یوتیوب و فیسبوک و اینستاگرام و مدیافایر و ... انواع سایت های دانلود و مشاهده ی فیلم و عکس
5.دانلود هوشمند از داخل مرورگر
و...
آدرس سورس:
https://github.com/Ali-YousefiTelori/Agrin
دانلود منیجر آگرین نرم افزاری بود که از سال 2012 شروع به پیاده سازی اون کردم و تا همین چند سال پیش به عنوان یک پروژه فردی توسعه داده شد.این یک پروژه ی #شکست_خورده هست چون من نتونستم ایده هایی که میخواستم رو کامل توش پیاده سازی کنم، دانلود از یوتیوب شروع خوبی برام بود تازه داشتم به درآمد خوبی می رسیدم شاید امروز اوضاعم خیلی فرق میکرد ولی به خاطر این قابلیت توسط #کافه_بازار حذف شد و من انگیزم کامل از بین رفت!
اما امروز اونو اپن سورس کردم تا توسعه دهندگانی که میخوان توی عرصه ی نرم افزارهای ویندوز و موبایل کار کنن شاید این سورس بتونه کمک حالشون باشه.
اون قدیما توی سال 2012 یه فرومی بود که من توش تاپیک زده بود در مورد توسعه ی این دانلود منیجر که هنوز موجوده:
http://forum.p30world.com/showthread.php?t=556052
وبلاگ رسمیش اون قدیما:
http://framework.blogfa.com/
از قابلیت های این نرم افزار مسائل زیر بود:
1.دانلود انواع فایل ها روی گوشی های اندروید و ویندوز
2.قابلیت دانلود با زمانبندی
3.گروه بندی
4.دانلود از آپارات،یوتیوب و فیسبوک و اینستاگرام و مدیافایر و ... انواع سایت های دانلود و مشاهده ی فیلم و عکس
5.دانلود هوشمند از داخل مرورگر
و...
آدرس سورس:
https://github.com/Ali-YousefiTelori/Agrin
توی سی شارپ سازنده های استاتیک کلاس های فرزند، زودتر از کلاس والد صدا زده میشن در حالی که در ارث بری ابتدا سازنده های کلاس های والد صدا زده میشن.
یعنی اگر یک کلاس Child داشته باشید که از کلاس Parent ارث میبره به شکل زیر:
چرا؟
چون ارث بری توی استاتیک معنی نداره برای همین وقتی اولین بار کلاسی رو استفاده میکنید یک نمونه از اون برای توابع استاتیک ساخته میشه برای همین بلافاصله اول توابع استاتیک اون کلاس صدا زده میشن و حتی سازنده های استاتیک کلاس والد صدا زده نمیشن مگر اینکه از کلاس والد هم استفاده کرده باشید. بنابراین صدا زده شدن سازنده های استاتیک کلاس بستگی به استفاده از خود اون کلاس داره (اول والد رو استفاده کنید پس والد صدا زده میشه یا اول فرزند رو استفاده کنید پس فرزند صدا زده میشه)
اما سازنده های غیر استاتیک به ترتیب از پایین ترین لایه شروع به صدا زده شدن می کنن اما این صدا زدن در واقع از لایه ی بالا انجام میشه، یعنی چی؟ یعنی ابتدا سازنده ی کلاس فرزند شروع به صدا زدن لایه های پایین تر میکنه برای همین شما میتونید در حالی که سازنده ی کلاس فرزند صدا زده میشه به سازنده ی کلاس والد ورودی بدید.بعد از اینکه سازنده ی کلاس پدر صدا زده شد حالا وارد سازنده ی کلاس فرزند میشیم.
بنابراین ما دو نوع سازنده ی استاتیک و غیر استاتیک داریم که در ارث بری به دو شکل متفاوت صدا زده میشن حواستون باشه.
#تخصصی
#سی_شارپ
@CsharpTips
یعنی اگر یک کلاس Child داشته باشید که از کلاس Parent ارث میبره به شکل زیر:
public class Parentبه ترتیبی که شماره گذاری کردم هر کدومشون اجرا میشن.
{
public Parent()
{
//Priority 3
}
static Parent()
{
//Priority 2
}
}
public class Child : Parent
{
public Child()
{
//Priority 4
}
static Child()
{
//Priority 1
}
}
چرا؟
چون ارث بری توی استاتیک معنی نداره برای همین وقتی اولین بار کلاسی رو استفاده میکنید یک نمونه از اون برای توابع استاتیک ساخته میشه برای همین بلافاصله اول توابع استاتیک اون کلاس صدا زده میشن و حتی سازنده های استاتیک کلاس والد صدا زده نمیشن مگر اینکه از کلاس والد هم استفاده کرده باشید. بنابراین صدا زده شدن سازنده های استاتیک کلاس بستگی به استفاده از خود اون کلاس داره (اول والد رو استفاده کنید پس والد صدا زده میشه یا اول فرزند رو استفاده کنید پس فرزند صدا زده میشه)
اما سازنده های غیر استاتیک به ترتیب از پایین ترین لایه شروع به صدا زده شدن می کنن اما این صدا زدن در واقع از لایه ی بالا انجام میشه، یعنی چی؟ یعنی ابتدا سازنده ی کلاس فرزند شروع به صدا زدن لایه های پایین تر میکنه برای همین شما میتونید در حالی که سازنده ی کلاس فرزند صدا زده میشه به سازنده ی کلاس والد ورودی بدید.بعد از اینکه سازنده ی کلاس پدر صدا زده شد حالا وارد سازنده ی کلاس فرزند میشیم.
بنابراین ما دو نوع سازنده ی استاتیک و غیر استاتیک داریم که در ارث بری به دو شکل متفاوت صدا زده میشن حواستون باشه.
#تخصصی
#سی_شارپ
@CsharpTips
Forwarded from Ali Yousefi ˢᵒᶠᵗʷᵃʳᵉ ᴰᵉᵛᵉˡᵒᵖᵉʳ
Media is too big
VIEW IN TELEGRAM
به نحوه ی صدا زدن دو تابع زیر دقت کنید:
اتفاقی که بعد از اجرا میوفته:
توی تابع اول اپلیکیشن شما کرش میکنه و به طور کامل با خطای unhandled exception بسته میشه.
توی تابع دوم اپلیکیشن شما به راه خودش ادامه میده.
چرا این اتفاق میوفته؟
چون سازنده ی Task متد Func<Task?> رو پیاده سازی نکرده، این یعنی ورودی شما به عنوان کانستراکتور یا سازنده مستقیم به یک Action تبدیل شده و وارد سازنده ی کلاس میشه.وقتی شما به یک Action ورودی async میدید این درواقع برای شما مثل یک تابع async void عمل میکنه و اگر Exception ای اونجا رخ بده چون هیچکجا هندل نشده و باعث میشه اپ شما کرش کنه.
راه کارش اینه که شما try catch بذارید و جلوی این مشکل رو بگیرید.
اما روش بهینه اش اینه که بذارید توسط خود Task.Run این اتفاق بیوفته چون خود Task خطاهارو به نحوی هندل میکنه که unhandled exception نخورید و باعث میشه اپ شما کرش نکنه اما لاگ کردن این نوع خطاها نیازمند یک کلاس Helper هست که با پیاده سازیش خودتون میتونید توی کارهای پس زمینه ی خودتون لاگ بذارید که اگر خطایی خورد متوجه عملکرد نرم افزار بشید.
پس مراقب باشید که چطوری از Task استفاده می کنید.
#تخصصی
#سی_شارپ
#تسک
#Task
#Thread
کانال تلگرام:
@CsharpTips
new Task(async () => throw new NotImplementedException()).Start();
Task.Run(async () => throw new NotImplementedException());
اتفاقی که بعد از اجرا میوفته:
توی تابع اول اپلیکیشن شما کرش میکنه و به طور کامل با خطای unhandled exception بسته میشه.
توی تابع دوم اپلیکیشن شما به راه خودش ادامه میده.
چرا این اتفاق میوفته؟
چون سازنده ی Task متد Func<Task?> رو پیاده سازی نکرده، این یعنی ورودی شما به عنوان کانستراکتور یا سازنده مستقیم به یک Action تبدیل شده و وارد سازنده ی کلاس میشه.وقتی شما به یک Action ورودی async میدید این درواقع برای شما مثل یک تابع async void عمل میکنه و اگر Exception ای اونجا رخ بده چون هیچکجا هندل نشده و باعث میشه اپ شما کرش کنه.
راه کارش اینه که شما try catch بذارید و جلوی این مشکل رو بگیرید.
اما روش بهینه اش اینه که بذارید توسط خود Task.Run این اتفاق بیوفته چون خود Task خطاهارو به نحوی هندل میکنه که unhandled exception نخورید و باعث میشه اپ شما کرش نکنه اما لاگ کردن این نوع خطاها نیازمند یک کلاس Helper هست که با پیاده سازیش خودتون میتونید توی کارهای پس زمینه ی خودتون لاگ بذارید که اگر خطایی خورد متوجه عملکرد نرم افزار بشید.
پس مراقب باشید که چطوری از Task استفاده می کنید.
#تخصصی
#سی_شارپ
#تسک
#Task
#Thread
کانال تلگرام:
@CsharpTips
Forwarded from کدهک
C# Programming Guide
Photo
به شخصه اصلا توی پروژه ها و پکیج هایی که خیلی پرفورمنس توشون مهمه از این روش استفاده نمی کنم (اعتبار سنجی ویدئوی بالا) و توصیه میکنم شما هم اگر پکیجی دارید که کارش اینه از این روش های مدیریت اعتبار سنجی ورودی ها استفاده نکنید (خیلی هم این نوع اعتبار سنجی ها مرسومه و کسی فکر بهتری براش نداره)
پترنی که من توی این شرایط ساختم و ازش استفاده میکنم:
شما باید فرض رو بر این بگیرید که همه چیز درسته و طبق معمول داده های ورودی اشتباه نیست، وقتی چیزی اشتباه میشه یعنی داده های ورودی بنابه هر دلیلی اشتباه وارد شده که احتمالا یا از باگ هست یا کاربر داده های ورودی رو اشتباه فرستاده.
اما چطوری به برنامه نویس بگیم که به پکیج ما داده ی ورودی اشتباهی وارد کرده و خطای درستی بهش نشون بدیم تا مشکل یابی براش سریع و راحت باشه؟
این پترن این شکلی کار میکنه که کلاس های شما و هسته ی بیزینسی اون داده های خام و لاجیک مخصوص به خودشون رو دارن، بدون اینکه اعتبار سنجی ای توش باشه و بدون اینکه حتی try و catch توش گذاشته باشید. بنابراین توی لاجیک اصلی برنامه فرض بر اینه که همه چیز درسته.
در قسمتی از پروژه یک try و catch کلی دارید که به محض خوردن به Exception کلاس های اعتبار سنجی رو اجرا میکنن و خطای اعتبار سنجی صحیحی رو به برنامه نویس نشون میدن. حتی میتونید مدیریت این Try catch ها رو به خود برنامه نویس بسپارید.
اینکار باعث میشه فقط در صورتی که به exception خوردید اعتبار سنجی ها اتفاق بیوفته و خطای درستی به کاربر نشون داده بشه.
به این نکته ی مهم توجه کنید مثلا در سریالایز کردن یا دیسریالایز کردن یک داده ی json ممکنه میلیون ها پردازش در لحظه داشته باشید که ممکنه در ماه هم به یک استثنا نخورید. ولی وقتی اعتبار سنجی رو داخل منطق اصلی بذارید به ازای میلیون ها پردازش شما اونا رو انجام دادید.
چقدر سربار الکی ایجاد شده در حالی که با استفاده از این پترن همهی اون سربار رو از بین بردید.
اینجاست که پکیجی مثل BinaryGo نسبت به بقیه پرفورمنس بالاتری داره چون از این پترن استفاده میکنه (البته هنوز این پترن رو تکمیل نکردم و در نظر دارم که یک پکیج براش بسازم)
نکته: این پترن توی همه ی پروژه ها توصیه نمیشه فقط پروژه هایی که تمرکزشون روی پرفورمنسه خیلی مهمه.
پترنی که من توی این شرایط ساختم و ازش استفاده میکنم:
شما باید فرض رو بر این بگیرید که همه چیز درسته و طبق معمول داده های ورودی اشتباه نیست، وقتی چیزی اشتباه میشه یعنی داده های ورودی بنابه هر دلیلی اشتباه وارد شده که احتمالا یا از باگ هست یا کاربر داده های ورودی رو اشتباه فرستاده.
اما چطوری به برنامه نویس بگیم که به پکیج ما داده ی ورودی اشتباهی وارد کرده و خطای درستی بهش نشون بدیم تا مشکل یابی براش سریع و راحت باشه؟
این پترن این شکلی کار میکنه که کلاس های شما و هسته ی بیزینسی اون داده های خام و لاجیک مخصوص به خودشون رو دارن، بدون اینکه اعتبار سنجی ای توش باشه و بدون اینکه حتی try و catch توش گذاشته باشید. بنابراین توی لاجیک اصلی برنامه فرض بر اینه که همه چیز درسته.
در قسمتی از پروژه یک try و catch کلی دارید که به محض خوردن به Exception کلاس های اعتبار سنجی رو اجرا میکنن و خطای اعتبار سنجی صحیحی رو به برنامه نویس نشون میدن. حتی میتونید مدیریت این Try catch ها رو به خود برنامه نویس بسپارید.
اینکار باعث میشه فقط در صورتی که به exception خوردید اعتبار سنجی ها اتفاق بیوفته و خطای درستی به کاربر نشون داده بشه.
به این نکته ی مهم توجه کنید مثلا در سریالایز کردن یا دیسریالایز کردن یک داده ی json ممکنه میلیون ها پردازش در لحظه داشته باشید که ممکنه در ماه هم به یک استثنا نخورید. ولی وقتی اعتبار سنجی رو داخل منطق اصلی بذارید به ازای میلیون ها پردازش شما اونا رو انجام دادید.
چقدر سربار الکی ایجاد شده در حالی که با استفاده از این پترن همهی اون سربار رو از بین بردید.
اینجاست که پکیجی مثل BinaryGo نسبت به بقیه پرفورمنس بالاتری داره چون از این پترن استفاده میکنه (البته هنوز این پترن رو تکمیل نکردم و در نظر دارم که یک پکیج براش بسازم)
نکته: این پترن توی همه ی پروژه ها توصیه نمیشه فقط پروژه هایی که تمرکزشون روی پرفورمنسه خیلی مهمه.
توی ویژوال استادیو شما توانایی اینو دارید که از قابلیت Multiple target frameworks استفاده کنید و برای پکیج هاتون چندین نسخه از دات نت رو ساپورت کنید و برای هر کدوم کد خاص خودشون رو بزنید.
مثلا وقتی یک قابلیت جدید توی دات نت 6 اضافه میشه پکیج شما باید هم توانایی کامپایل و تست روی نسخه ی 6 رو داشته باشه و هم نسخه ی 2.1 استاندارد، اما اگر میخواهید قسمتی از کد رو تغییر بدید تا از نسخه ی جدید بهرمند بشید باید از شرط های بخصوصی استفاده کنید که توی تصویر دارید می بینید.
اما دغدغهی من که سالهاست برای پکیج هام با این قابلیت کار میکنم اینه که کدهام رو ناخوانا میکنه و از کسانی که در ایده گذاری های مایکروسافت کار میکنن تقاضا دارم یک قابلیت اضافه کنند که توی کادر بالا وقتی من انتخابش میکنم تمامی #if ها رو حذف کنه و فقط کد مخصوص اون پلتفرم رو نشون بده.
اینطوری دیگه مشکل کد کلین هم رفع میشه و البته هر وقت بخوام میتونم با قابلیتی که وجود داره همهی کد های همه ی پلتفرم هارو یکجا ببینم تا تشابه و رفع باگ گیجم نکنه.
#برنامه_نویسی
#تخصصی
#دات_نت
#سی_شارپ
#dotnet
#csharp
مثلا وقتی یک قابلیت جدید توی دات نت 6 اضافه میشه پکیج شما باید هم توانایی کامپایل و تست روی نسخه ی 6 رو داشته باشه و هم نسخه ی 2.1 استاندارد، اما اگر میخواهید قسمتی از کد رو تغییر بدید تا از نسخه ی جدید بهرمند بشید باید از شرط های بخصوصی استفاده کنید که توی تصویر دارید می بینید.
اما دغدغهی من که سالهاست برای پکیج هام با این قابلیت کار میکنم اینه که کدهام رو ناخوانا میکنه و از کسانی که در ایده گذاری های مایکروسافت کار میکنن تقاضا دارم یک قابلیت اضافه کنند که توی کادر بالا وقتی من انتخابش میکنم تمامی #if ها رو حذف کنه و فقط کد مخصوص اون پلتفرم رو نشون بده.
اینطوری دیگه مشکل کد کلین هم رفع میشه و البته هر وقت بخوام میتونم با قابلیتی که وجود داره همهی کد های همه ی پلتفرم هارو یکجا ببینم تا تشابه و رفع باگ گیجم نکنه.
#برنامه_نویسی
#تخصصی
#دات_نت
#سی_شارپ
#dotnet
#csharp
توابعی که خروجی Task دارند ولی از کیورد async توشون استفاده نشده در واقع sync هستند.
در مثالی که در تصویر میبینید شاید تصور بشه که متد Example باید در پس زمینه اجرا بشه ولی این اتفاق نمیوفته و کاملا به صورت sync اجرا خواهد شد. این متد در واقع مثل بقیه ی متد های sync فقط یک خروجی Task داره. مثل متد زیر:
پس حواستون باشه که اشتباه نکنید.
#تخصصی
#سی_شارپ
#dotnet
#csharp
#task
#async
@CSharpTips
در مثالی که در تصویر میبینید شاید تصور بشه که متد Example باید در پس زمینه اجرا بشه ولی این اتفاق نمیوفته و کاملا به صورت sync اجرا خواهد شد. این متد در واقع مثل بقیه ی متد های sync فقط یک خروجی Task داره. مثل متد زیر:
static string Example()
پس حواستون باشه که اشتباه نکنید.
#تخصصی
#سی_شارپ
#dotnet
#csharp
#task
#async
@CSharpTips
Xamarin Versus .NET MAUI | Syncfusion Blogs
https://www.syncfusion.com/blogs/post/xamarin-versus-net-maui.aspx/amp
https://www.syncfusion.com/blogs/post/xamarin-versus-net-maui.aspx/amp
Syncfusion Blogs
Xamarin Versus .NET MAUI
Though .NET MAUI is the evolution of Xamarin, developers are confused in choosing one. Here’s a comparison to better understand Xamarin and .NET MAUI.
خطا خوردن سرویس سینک تاریخ و زمان ویندوز سرور باعث شد خرید هامون برای دقایقی حدود چند ساعت جابجا بشه چون تاریخ های خرید بر اساس تاریخ و زمان روی ویندوز هستند، مراقب این باگ ویندوز سرور باشید.
#باگ
@CsharpTips
#باگ
@CsharpTips
#تخصصی
استفاده از Enumerable ها همیشه هم خوب نیست، یک برنامه نویس باید بدونه کجا باید از Enumerable استفاده کنه و کجا باید به استفاده از اون خاتمه بده، در مثال بالا تا زمانی که یک کوئری از Enumerable رو ToList نکنید، هربار که روی اون پردازش انجام بدید مجدد فرایند کوئری ها اجرا خواهد شد.
#Csharp
@CsharpTips
استفاده از Enumerable ها همیشه هم خوب نیست، یک برنامه نویس باید بدونه کجا باید از Enumerable استفاده کنه و کجا باید به استفاده از اون خاتمه بده، در مثال بالا تا زمانی که یک کوئری از Enumerable رو ToList نکنید، هربار که روی اون پردازش انجام بدید مجدد فرایند کوئری ها اجرا خواهد شد.
#Csharp
@CsharpTips