Должен ли я опустить async / await, если это возможно? - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть метод, который занимает много времени: он вызывает БД и выполняет определенные вычисления синхронно:

public static MyResult MyMethod(int param1, int param2)
{
    // run a DB query, wait for result, make calculations...
    ...
}

Я хочу написать обертку для него, чтобы иметь возможность использовать его из моих WinFormsПользовательский интерфейс с ключевым словом "ожидание".Для этого я создаю другой метод, 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 ]

7 голосов
/ 22 ноября 2011

Используйте второй вариант.

Ваш первый параметр создает Task<MyResult>, а затем создает еще один Task<MyResult>, чтобы обернуть его. Упаковка не добавляет никакой ценности, только накладные расходы.

У Стивена Тауба есть отличное видео от BUILD под названием The Zen of Async: лучшие практики для лучшей производительности , в котором рассматриваются издержки async / await и альтернативы.

4 голосов
/ 22 ноября 2011

Это все о том, как на самом деле работает асинхронный.Если вы прочитаете http://msdn.microsoft.com/en-us/magazine/hh456402.aspx и, в частности: http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229662.aspx, вы обнаружите, что ключевое слово async заставляет компилятор создать машину состояний в вашем коде.Это накладные расходы и ради производительности будет работать хуже, поскольку в приведенном коде это абсолютно не требуется.

Что касается читабельности: я должен использовать асинхронность только там, где это действительно может изменить ситуацию.асинхронность для меня означает, что определенный метод завершается в несколько этапов асинхронным способом.Когда вы определяете простой прокси-метод, подобный приведенному выше, вы больше не хотите усложнять синтаксис.

...