Спроба зрозуміти новий шаблон async / await,У мене є одне питання, на яке я не можу знайти відповідь, а саме, якщо я повинен прикрасити свої методи з async, якщо я маю намір викликати ці методи з інших функцій async, або просто повернутися Task
s де це доречно?
Іншими словами, який з цих класів 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
коли вам це не потрібно.