Должен ли я опустить async / await, если это возможно?
У меня есть метод, который занимает много времени: он вызывает БД и делает определенные вычисления синхронно:
public static MyResult MyMethod(int param1, int param2)
{
// run a DB query, wait for result, make calculations...
...
}
Я хочу написать обертку для нее, чтобы иметь возможность использовать ее из моего пользовательского интерфейса WinForms с ключевым словом "await". Для этого я создаю другой метод, MyResultAsync. У меня есть выбор, как именно это написать:
// option 1
public async static Task<MyResult> MyResultAsync(int param1, int param2)
{
return await TaskEx.Run(() => MyMethod(param1, param2));
}
// option 2
public static Task<MyResult> MyResultAsync(int param1, int param2)
{
return TaskEx.Run(() => MyMethod(param1, param2));
}
Итак, какой вариант предпочтительнее и почему? Как видите, разница только в наличии / отсутствии ключевых слов async и await.
Спасибо!
2 ответа
Используйте второй вариант.
Ваш первый вариант создает Task<MyResult>
, а затем создает другой Task<MyResult>
обернуть это. Упаковка не добавляет никакой ценности, только накладные расходы.
У Стивена Тауба есть отличное видео от BUILD под названием "Zen of Async: лучшие практики для лучшей производительности", которое охватывает async
/await
накладные расходы и альтернативы.
Все о том, как на самом деле работает асинхронный. Если вы читаете http://msdn.microsoft.com/en-us/magazine/hh456402.aspx и, в частности: http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229662.aspx вы обнаружите, что ключевое слово async заставляет компилятор создавать машину состояний в вашем коде. Это накладные расходы и ради производительности будет работать хуже, так как это абсолютно не требуется в данном коде.
Что касается читабельности: я должен использовать async только там, где это действительно может иметь значение. асинхронность для меня означает, что определенный метод завершается в несколько этапов асинхронным способом. Когда вы определяете простой прокси-метод, подобный приведенному выше, вы больше не хотите усложнять синтаксис.