به طور معمول متدهایی که به صورت async نوشته میشوند, از متدهای sync سریعتر اجرا نمیشوند و فقط باعث میشوند که سیستم بتواند به  ریکوئست های بیشتری پاسخ بدهد. در مطلب نحوه کار Thread pool این موضوع ارائه شد. همچنین در سایت sharplab.io میتوانید کدهایی که به صورت async نوشته میشوند را مشاهده کنید.

 در این مطلب میخواهیم async / await های اضافی را در کدها حذف کنیم. سناریوی خواندن اطلاعات از دیتابیس را در نظر بگیرید, به طور معمول یک کنترلر و یک سرویس داریم. که درون سرویس دیتا به صورت async خوانده میشود. ولی نیازی نیست که در کنترلر هم اکشن مورد نظر به صورت async نوشته شود. کد زیر را در نظر بگیرید:

public class TagService : ITagService
{
    private readonly ApplicationDbContext _context;

    public TagService(ApplicationDbContext context)
    {
        _context = context;
    }
    public async Task<IEnumerable<Tags>> GetTagsAsync(CancellationToken cancellationToken)
    {
        return await _context.Tags.ToListAsync(cancellationToken);
    }
}

متد GetTagsAsync به صورت async نوشته شده است و شامل async و await میباشد. و کد کنترلر :

[Route("api/[controller]")]
[ApiController]
public class TagController : ControllerBase
{
    private readonly ITagService _tagService;

    public TagController(ITagService tagService)
    {
        _tagService = tagService;
    }
    [HttpGet]
    public async Task<IEnumerable<Tags>> Get(CancellationToken cancellationToken)
    {
        return await _tagService.GetTagsAsync(cancellationToken);
    }
}

در کنترلر نیز متد دریافت تگ ها به صورت async نوشته شده است که نیازی به آن نیست و میتوانیم آن را به صورت زیر بازنویسی کنیم:

[HttpGet]
public Task<IEnumerable<Tags>> Get(CancellationToken cancellationToken)
{
    return _tagService.GetTagsAsync(cancellationToken);
}

در شرایطی که شما یک متد async دارید و زمانی که این متد را فراخوانی میکنید و به مقدار بازگشتی آن هیج نیازی ندارید مانند مثال بالا میتوانید قسمت async/await را پاک کنید. اما اگر بعد از فراخوانی متد به مقدار آن نیاز دارید باید از async/await استفاده کنید مانند مثال زیر:

[HttpGet]
public async Task<IEnumerable<Tags>> Get(CancellationToken cancellationToken)
{
    var tags = await _tagService.GetTagsAsync(cancellationToken);
    var validTags = tags.Where(a => a.IsValid).ToList();
    return validTags;
}

در کد بالا برای ایجاد شرایطی که به async/await نیاز داشته باشیم, تگ هایی را که معتبر هستند را بعد از دریافت از سرویس فیلتر کرده ایم.

مطالب مرتبط:

;)

Powered by Froala Editor

نظرات