/ / Асинхронний аж донизу? - c #, async-await, c # -5.0

Асинхронний шлях вниз? - c #, async-wait, c # -5.0

Спроба зрозуміти новий шаблон async / await,У мене є одне питання, на яке я не можу знайти відповідь, а саме, якщо я повинен прикрасити свої методи з async, якщо я маю намір викликати ці методи з інших функцій async, або просто повернутися Tasks де це доречно?

Іншими словами, який з цих класів A, B або C найкращий, і чому?

class A<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}

public async Task<T> foo2() //Could be consumed
{
return await foo3();
}

private async Task<T> foo3() //Private
{
return await Task.Run(...);
}
}

class B<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}

public async Task<T> foo2() //Could be consumed
{
return await foo3();
}

private Task<T> foo3() //Private
{
return Task.Run(...);
}
}

class C<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}

public Task<T> foo2() //Could be consumed
{
return foo3();
}

private Task<T> foo3() //Private
{
return Task.Run(...);
}
}

Це здається зайвим для надмірних методів, тому я, природно, нахиляюся C, але в той же час він відчуває себе дещо незручно працювати Task<T> якщо ви не використовуєте await ключове слово

Відповіді:

9 для відповіді № 1

Обидві версії працюють однаково, єдина різниця в тому, що при використанні await Тут ви отримуєте певну ефективність покарання (тому що державний апарат повинен бути налаштований і продовження, швидше за все, буде використано).

Отже, це зводиться до компромісу: Ви хочете, щоб ваші методи були дещо ефективнішими за рахунок того, щоб бути трохи менш читабельними? Або ви готові пожертвувати продуктивністю для зручності читання?

Як правило, я б радив вам звернутися за читабельністюПо-перше, і зосередитися лише на продуктивності, якщо профілювання говорить вам, що це варто. await.

Також зверніть увагу, що ваш клас C як і раніше не йде досить далеко: foo1() також не потрібно await.


2 для відповіді № 2

The async у підписі є, щоб дозволити компілятору створити машину переписування стану, що міститься в коді, необхідному для реалізації await семантики в загальному випадку.

Ваш приклад - це особливий випадок, деВам не потрібно це переписування: асинхронна операція - це остання річ, що відбувається в межах методу. Такий метод вже можливий і дійсний у Росії .NET4.0. Ця сумісність може бути однією з причин уникнути async коли вам це не потрібно.