2016-10-06 12 views
2

を非同期メソッドを実装します。は私が(非同期)を実装するために私を強制的にインタフェースを持って同期タスク

namespace Microsoft.Owin.Security.Infrastructure 
{ 
    public interface IAuthenticationTokenProvider 
    { 
     .. 
     Task CreateAsync(AuthenticationTokenCreateContext context); 
     .. 
    } 
} 

を私は、このメソッドを実装したいが、私は何を待っていませんよ。私はいくつかのタスクを、何かを待つか、返却する必要がありますが、そうでない場合は私のコードはコンパイルされません。:

public class MyImplementation: IAuthenticationTokenProvider 
{ 
    public async Task CreateAsync(AuthenticationTokenCreateContext context) 
    { 
     /// do something synchronously. 

     await something here? ?? 
    } 
} 

私の質問は:どのように私は非同期的に何かをせずに、このメソッドを実装するのでしょうか?私は、ソリューションのカップル(のawait task.Yield()、またはawait Task.Run(() => {}))を発見したましたが、まだ私は完全に正しい実装とその理由が何であるかを理解することはできません

+0

あなたが何かを待っていない場合は、コードをコンパイルする必要があります。実際には非同期ではありません。あなたのケースでは、IOを実行しない高速実装が基本的にあれば大丈夫かもしれませんが、それ以外の場合は非同期で作業する必要があります... –

+0

コンパイル中に警告が表示される: "非同期メソッドが不足しています。 「演算子を待って同期的に実行されます」。なぜこの警告が出るのですか?なぜそれは重要ですか? –

+0

警告はそれ自体のことを言います - あなたは非同期メソッドを持っていますが、それは同期的に完了します。あなたの場合、それはあなたが望むものかもしれません。 'CreateAsync'メソッドの本体が何をしているのかを知らなくても、それを伝えるのは難しいです。それがいつも素早ければ、それは問題ありません。ちょっとしたコードの警告を抑止できます。 –

答えて

2

だけ待たずにメソッドを実装します。

public async Task<Foo> GetFooAsync() 
{ 
    return new Foo(); 
} 

コンパイラはあなたに何かを待っていると警告していますが、何かを待つ非同期メソッドの必要条件ではありません。

あなたがしたくない場合は、あなたは何も待っていません。 aysncメソッドのオーバーヘッド(非同期の「状態マシン」に関連するコストがあります。 )望ましくないこと、あなたは可能性

public Task<Foo> GetFooAsync() 
{ 
    return Task.FromResult(new Foo()); 
} 
+1

'' new Foo() 'が例外をスローすると、コストの心配がなくなります(おそらくマイクロ最適化です)。' new Foo() 'が例外をスローした場合の効果の違いを心配してください:' async'バージョンでは、正常に完了しました。他のバージョンでは、タスクはまったく返されません。 – hvd

+0

問題は私がタスクで作業していないことですが、タスクだけでは問題ありません。したがって、非同期の無効です。したがって、結果を作成することは何もありません。 –

+0

@ClarkKent 'Task 'は 'Task'を実装していますので、' Task.FromResult(0) 'を返すだけで' Task'の(非汎用の)戻り値の型を満たすことができます。タスクの「価値」は使用されません。 – spender

0

私のソリューションは、すでに実行され、同期メソッドの結果を表しTaskを返すことです。そうすることで、非同期状態マシンのオーバーヘッドなしに、例外が発生したときにセマンティクスを非同期メソッドとして維持することができます。

その後、私は経由で呼び出す
public static Task AsCompletedTask<T>(this Action<T> func, T arg) 
    { 
     var tcs = new TaskCompletionSource<VoidResult>(); 
     try 
     { 
      func(arg); 
      tcs.SetResult(voidResult); 
     } 
     catch (Exception e) 
     { 
      tcs.SetException(e); 
     }; 

     return tcs.Task; 
    } 

:ところで、私はことを嫌い

public Task CreateAsync(AuthenticationTokenCreateContext context) 
    { 
     return ((Action<AuthenticationTokenCreateContext>)Create).AsCompletedTask(context); 
    } 

十分おかしい、私は実際に私は拡張メソッドを持って、この同じインターフェイス

上の同じ理由のためにこれをやりました名。誰かがより良い提案をしているなら、私はすべて耳です。

関連する問題