2012-11-23 18 views
8

私のようなインターフェースを持っている場合:非同期programmicと仮想関数

using System.Threading.Tasks; 

... 

public interface IFoo 
{ 
    Task doIt(); 

    Task<bool> doItAndReturnStuff(); 
} 

だけが非同期メソッドを必要としないために起こる、このインタフェースを実装するクラスの一つは、どのように私は、これらの機能を無効に修正することができますか?

つまり、Taskオブジェクトにラップされた「void」と「bool」を正しく返すにはどうすればよいですか?例えば

public class FooHappensToNotNeedAsync : IFoo 
{ 
    public override Task doIt() 
    { 
    // If I don't return anything here, I get 
    // error that not all code paths return a value. 
    // Can I just return null? 
    } 

    public override Task<bool> doItAndReturnStuff() 
    { 
    // If I want to return true, how to I do it? 
    // This doesn't work: 
    return true; 
    } 
} 

NOTE - このインタフェースを実装するクラスのいくつかは、実際の非同期でているので、私は完全にタスクのものを取り除くことはできません。

おかげ

+0

は '(()=>真)Task.Runを返す;' –

+1

@ LB:それは本当の理由がないため余分な仕事を作り出し、すでに完了している仕事を返すよりも予測が難しい。 –

答えて

15

それはあなたが達成しようとしているものは明らかではないが、一つのアプローチ(「通常」のコードのように、ほとんどのように見えることになる)とにかくそれらを非同期メソッドにするために、おそらくです:

public async Task DoIt() 
{ 
    // No-op 
} 

public async Task<bool> DoItAndReturnStuff() 
{ 
    return true; 
} 

await式が1つもない場合、この方法は同期して完了します。それぞれの方法について警告が表示されますが、#pragmaを使用してこのコードを無効にできます。また

- と私は警告を無効にする#pragmaを必要としないという点で、より簡単に推測 - Task.FromResultを使用することです:

public Task DoIt() 
{ 
    // Returns a Task<bool>, but that's okay - it's still a Task 
    return Task.FromResult(true); 
} 

public Task<bool> DoItAndReturnStuff() 
{ 
    return Task.FromResult(true); 
} 
+0

上記の最初のコードスニペットは、 "とにかく非同期メソッドを作成するためのものです" - コンパイルされません。だからこそ私はこの質問をしています。 「エラーCS0161:すべてのコードパスが値を返すわけではありません」というメッセージが表示されます。私はあなたがそこに少しsnarkyコメントを持っていた理由だと思う:)。しかし、あなたの2番目のスニペット、特にDoIt()の実装は、まさに私が探していた種類のハックです。どうもありがとう! – swinefeaster

+1

@swinefeaster:非同期修飾子を組み込んだ場合、最初のバージョンは本当にコンパイルする必要があります。あなたは本当ですか?私がコンピュータに戻ったときに二重チェックをします。 –

+1

@swinefeaster:私はそれを試しましたが、うまくいきました - それは基本クラスメソッドをオーバーライドしないで、インターフェイスを実装しているので 'override'を削除しなければなりませんでした。私は 'async'修飾子なしでのみCS0161を取得します。 –