2016-05-18 10 views
3

私はリポジトリコードを簡略化し、共通の機能を提供するためにFuncsを使いたいと思っています。今、このコードに基づいて 問題:C#のAsync Func - 正しいasyncが使用を待っています

namespace Test 
{ 
    public class Demo 
    { 

     public Task<Person> GetAsync1(Guid id) 
     { 
      return ExecuteAsync(context => context.Persons.GetAsync(id)); 
     } 

     public async Task<Person> GetAsync2(Guid id) 
     { 
      return await ExecuteAsync(async context => await context.Persons.GetAsync(id)); 
     } 

     public Task<Person> GetAsync3(Guid id) 
     { 
      return ExecuteAsync(async context => await context.Persons.GetAsync(id)); 
     } 

     public Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func) 
     { 
      using(var context = new Context()) 
      { 
       return func(context); 
      } 
     } 
    } 

} 

ここに私のために問題を正しく非同期funcを呼び出す方法になりました。この3つのGetメソッドのうち正しいものはどれですか? 最初のものでは、この時点でハングアップするため、デッドロックが発生すると思います。 2番はうまく動作しますが、ここで2つの非同期/待機は、タスクの再ラッピングのために正しいとは思いません!

答えて

8

行うには罰金実際にすべての3 GetAsync implmentations(個人的に私はGetAsync1を使用します)、何を持っていることはあなたがするまでコンテキストを処分しないでくださいfuncの出力を待っていることでExecuteAsync

public async Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func) 
{ 
    using(var context = new Context()) 
    { 
     return await func(context); 
    } 
} 

にバグです関数はその作業を完了しました。

+0

Ouhh。私は完全にそれを逃した。それから私は間違ったトラックに完全にはいませんでした。本当にありがとう! – PeterLiguda

関連する問題