2015-03-03 2 views
0

В this question Я спросил, как сделать полезный метод, который я использую. Ответ на мой вопрос заключается в следующем:Как я могу упростить этот метод

public async Task<TResult> TryAsync<TResult>(Func<IDataServices, Task<TResult>> method) 
    { 
     using (IDataServices client = GetClient()) 
     { 
      return await method(client); 
     } 
    } 

выше, называется так:

Model m = await ClientResolver.TryAsync(async x => await x.GetModelByIDAsync(modelID)); 

Просто глядя на это штуковина заставляет меня задаться вопросом, как это могло бы быть эффективным. Я жду здесь три раза, чтобы избавить себя от необходимости писать инструкцию. Есть ли лучший способ, возможно, переход IAwitable? Я использую эту конструкцию довольно часто, поэтому я думаю, что небольшая оптимизация пройдет долгий путь. Я далеко по дороге, используя async, жду в своем приложении, и я действительно начинаю думать, что хвост виляет собакой. Но это история на другой день.

+0

Обратите внимание, что мой вопрос не имеет ничего общего с TPL. – Sam

+0

* так что я думаю, что немного оптимизация пройдет долгий путь * Что вы подразумеваете под этим? Вы сравнили свой код и обнаружили это как узкое место? Или это просто ощущение, что что-то можно улучшить? Если это последний, я бы сказал, пусть этот код будет, так как я ничего не вижу * с ним. –

+0

@YuvalItzchakov Просто чувствую себя. Я просто использую его много, поэтому, если я смогу найти небольшую экономию, это будет полезно. Async/await все еще ловкость для меня, как я уже говорил. – Sam

ответ

0

Вы должны быть в состоянии уйти только с

Model m = await ClientResolver.TryAsync(x => x.GetModelByIDAsync(modelID)); 

Ваш метод TryAsync уже await в нем. Я думаю, что если вы хотите его оптимизировать, вам нужно продумать его и посмотреть, где проблемы. Одной из возможных оптимизаций может быть повторное использование клиента в классе.

Вы также можете избежать переключения в основной контекст с помощью ConfigureAwait(false) в TryAsync, который может помочь, но усиление производительности будет очень незначительным.

public async Task<TResult> TryAsync<TResult>(Func<IDataServices, Task<TResult>> method) 
{ 
    using (IDataServices client = GetClient()) 
    { 
     return await method(client).ConfigureAwait(false); 
    } 
} 
Смежные вопросы