گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
یادآوری و نکات تکمیلی درباره ی مدیریت استثنا در async await :

در حالت اجرا بدون استفاده از ویژال استودیو یا با حالت بدون دیباگ اش ، وقتی قسمتِ await را در try catch بذاریم ، exception هایی که در نخ جدید (که همون در Task های اجرا شده هست) پرتاب میکنیم ، هندل و مدیریت میشن .


  • متدهای Task.Factory.StartNew یا Task.Run یا Task.Start :

  • Task.Run و Task.Factory.StartNew هر دو برای ایجاد و زمان‌بندی اشیاء Task استفاده می‌شوند. Task.Run در واقع یک میانبر برای Task.Factory.StartNew است که با استفاده از مقادیر پیش‌فرضی برای پارامترها، یک Task را اجرا می‌کند. به عنوان مثال:
  • Task.Run(action);
  • معادل با:
  • Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
  • است.

  • اما Task.Factory.StartNew گزینه‌های بیشتری را در اختیار شما قرار می‌دهد و زمانی که نیاز به کنترل دقیق‌تری دارید، می‌توانید از آن استفاده کنید.

  • به عنوان مثال، اگر می‌خواهید یک Task طولانی را اجرا کنید و نمی‌خواهید از یک نخ از thread pool استفاده کنید، می‌توانید با استفاده از Task.Factory.StartNew و گزینه TaskCreationOptions.LongRunning، یک نخ جدید برای اجرای Task ایجاد کنید:
  • Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);

  • در مورد Task.Start، باید بگویم که این متد فقط برای شروع یک Task استفاده می‌شود و نمی‌توانید با استفاده از آن یک Task را ایجاد کنید. به عنوان مثال:
  • var task = new Task(action);
  • task.Start();
  • وقتی یک Task را با استفاده از Task.Run یا Task.Factory.StartNew ، بصورت پیش فرض که بدون گزینه TaskCreationOptions.LongRunning است ، ایجاد می‌کنید، آن Task در یک نخ از thread pool اجرا می‌شود.

  • استفاده از یک نخ از thread pool برای اجرای یک Task طولانی ممکن است منجر به کاهش کارایی شود، زیرا thread pool تعداد محدودی نخ دارد و اگر تمام نخ‌های آن در حال اجرای Taskهای طولانی باشند، ممکن است سایر Taskها منتظر بمانند تا یک نخ آزاد شود. برای جلوگیری از این مشکل، می‌توانید با استفاده از گزینه TaskCreationOptions.LongRunning، یک نخ جدید برای اجرای Task ایجاد کنید:

  • Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);

  • با استفاده از این گزینه، یک نخ جدید خارج از thread pool برای اجرای Task ایجاد می‌شود و thread pool در دسترس می‌ماند تا سایر Taskها را اجرا کند.
به طور کلی، اگر یک Task زمان زیادی را صرف انتظار برای پاسخ از یک منبع خارجی مانند پایگاه داده یا شبکه می‌کند، ممکن است به عنوان یک Task طولانی در نظر گرفته شود. در این حالت، استفاده از گزینه TaskCreationOptions.LongRunning
 

جدیدترین ارسال ها

بالا