2012-08-28 6 views
12

私はインターフェイスは、空のインターフェイスメソッドで非同期の使用方法

interface IFoo { 
    Task SomeMethodAsync(); 
} 

を持って言って、私はこのインタフェースを実装したかったが、1クラスのメソッドは空白になっています。

私はこの警告が表示されますか?

async Task SomeMethodAsync() {} 

また、ダミータスクを返す必要がありますか?

async Task SomeMethodAsync() { await Task.Run(() => {}); } 

他にもオプションがありますか?

また、このメソッドを明示的なインターフェイスメソッドとして実装したいと考えています。何が違いますか?

+0

可能な[Interfaces and async methods]の複製(http://stackoverflow.com/questions/13573516/interfaces-and-async-methods) – abatishchev

答えて

14

Taskを返すメソッドはasyncである必要はありません。

私はこのようなものをお勧めします:私は、これは、同期方法であったならば、あなただけの空のメソッド本体を持っているだろうと仮定してい

Task IFoo.SomeMethodAsync() 
{ 
    return Task.FromResult(true); 
} 

を。これは空のメソッド本体に相当するasyncです。

2

これは、フレームワークがそのようなケースを処理する方法を決定するだけで決まります。

あなたは、芋、いくつかのオプションがあります(実行チェーンのいくつかの場所では、いくつかの方法でハンドルにそれをimmidiately実行を中断し、あなたが持っている)

  • は、例外を発生します。

  • リターンdefault-value(それはあなたが提供するソリューションになります。何もしないだけで、空のタスクこれについての悪い私はそれが何かをする、それはについて私に通知していないを期待して関数を呼び出すことです何もなく、どちらか何もしない。芋、これは悪いデザインです。

  • 復帰、発信者ので、発信者によって傍受され、いくつかのnot-valid-valueは、何か OKではないことを「知っている」。

0

これを抽象基本クラスで実行しました。

protected override async Task OnFoo(Bar bar) 
{ 
    await Task.FromResult(true); 
} 

protected abstract Task OnFoo(Bar bar); 

これは私が私の派生クラスでやっていたものです:私は、ステファン・クリアリーの方法を試してみましたが、C#の6

私の基本方法の一例をでコンパイルエラーを得ていました

他の回答の問題は、フレーズのキーワードreturnです。 Taskの戻り値は本質的にvoidなので、何も返すことはできません。また、awaitというキーワードが必要です。

関連する問題