Task در واقع از جنس کلاس است اما ValueTask از نوع struct است لذا ValueTask میزان کمتری حافظه اشغال میکنند.
به متدهای زیر دقت کنید:
async Task<int> TestTask(int d) { await Task.Delay(d); return 10; } /******************************************************/ async ValueTask<int> TestValueTask(int d) { await Task.Delay(d); return 10; }
استفاده از ValueTask مزیتهای زیر را در بر خواهد داشت:
1- بهبود پرفورمنس:
در متد اول چون از Task استفاده شده است پس باید از فضای Heap برای آن حافظه اشغال کرد همچنین عملکرد آن در حدود 120نانو ثانیه طول میکشد. اما در متد دوم در صورتی که به شکل synchronous اجرا شود دیگر فضایی از heap اشغال نخواهد شد. همچنین زمان اجرای آن 65نانو ثانیه خواهد بود.
2- افزایش انعطاف در پیادهسازی متدها:
اگر بخواهیم یک اینترفیس از نوع async را به شکل sync پیادهسازی کنیم ناگزیر به استفاده از Task.Run
و یا Task.FromResult
خواهیم بود اما با استفاده از ValueTaskها این مشکل را نخواهیم داشت. چون میتوان متد را به هر دو شکل sync و یا async پیادهسازی کرد.