به نحوه ی صدا زدن دو تابع زیر دقت کنید:
اتفاقی که بعد از اجرا میوفته:
توی تابع اول اپلیکیشن شما کرش میکنه و به طور کامل با خطای 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
👍6
توابعی که خروجی Task دارند ولی از کیورد async توشون استفاده نشده در واقع sync هستند.
در مثالی که در تصویر میبینید شاید تصور بشه که متد Example باید در پس زمینه اجرا بشه ولی این اتفاق نمیوفته و کاملا به صورت sync اجرا خواهد شد. این متد در واقع مثل بقیه ی متد های sync فقط یک خروجی Task داره. مثل متد زیر:
پس حواستون باشه که اشتباه نکنید.
#تخصصی
#سی_شارپ
#dotnet
#csharp
#task
#async
@CSharpTips
در مثالی که در تصویر میبینید شاید تصور بشه که متد Example باید در پس زمینه اجرا بشه ولی این اتفاق نمیوفته و کاملا به صورت sync اجرا خواهد شد. این متد در واقع مثل بقیه ی متد های sync فقط یک خروجی Task داره. مثل متد زیر:
static string Example()
پس حواستون باشه که اشتباه نکنید.
#تخصصی
#سی_شارپ
#dotnet
#csharp
#task
#async
@CSharpTips
👍4