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