2015-03-03 128 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)); 

只要看看这个玩意儿让我不知道它怎么可能是有效的。我在这里等待三次,为自己省去编写使用陈述的麻烦。有没有更好的方法,或许传递了IAwaitable?我非常频繁地使用这个构造,所以我认为一些优化将会有很长的路要走。我在应用程序中使用异步等待的道路上,我真的开始认为尾巴摇摆着狗。但那是另一天的故事。

+0

请注意我的问题与TPL无关。 – Sam 2015-03-03 05:48:31

+0

*所以我认为一点优化会走很长的路* Whay是你的意思吗?你是否对你的代码进行了基准测试,并发现它是瓶颈?或者,这只是一种直觉,可以改进一些东西?如果它是后者,我会说让这个代码,因为我没有看到任何*错误的*。 – 2015-03-03 05:53:03

+0

@YuvalItzchakov只是肠道的感觉。我只是使用它很多,所以如果我可以找到一点储蓄,这将是有益的。正如我所提到的,异步/等待对我来说仍然是一种欺骗手段。 – Sam 2015-03-03 05:56:21

回答

0

你应该能够逃脱只是

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

TryAsync方法中已经有await。我认为如果你想优化它,你需要对它进行分析,看看问题出在哪里。一种可能的优化可能是在整个班级重复使用客户端。

您还可以通过在TryAsync中使用ConfigureAwait(false)来避免切换到主要上下文,这可以帮助但性能增益会很小。

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