8

次のようなインターフェースがあるとします。

using System.Threading.Tasks;

...

public interface IFoo
{
  Task doIt();

  Task<bool> doItAndReturnStuff();
}

そして、このインタフェースを実装しているクラスの1つがたまたま非同期メソッドを必要としないのですが、どうすればこれらの関数を正しくオーバーライドできますか?

つまり、どのようにして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;
  }
}

注 - このインターフェースを実装しているクラスの中にはタスクのものを完全に取り除くことはできないあります実際には非同期です。

ありがとう


  • return Task.Run(()=>true); - L.B
  • @ L.B:それは本当の理由もなく余分な作業を作成し、すでに完了したタスクを返すよりも予測性が低いです。 - Jon Skeet

1 답변


15

何を達成しようとしているのかは明確ではありませんが、1つのアプローチ(「通常の」コードに最も似ている)は、おそらくそれらを非同期メソッドにすることです。

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

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

何もないawait式、メソッドはとにかく同期的に完了します。各メソッドについて警告が表示されますが、このコードの場合は、#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);
}


  • 上記の最初のコードスニペット - 「とにかくそれらを非同期メソッドにするため」 - コンパイルしません。私がこの質問をしているのはそのためです。 「エラーCS0161:すべてのコードパスが値を返すわけではありません」と表示されます。私はあなたがそこにちょっとぞっとするようなコメントをした理由だと思います:)。しかし、2番目のスニペット、特にDoIt()の実装は、まさに私が探していたハックの一種です。どうもありがとう! - swinefeaster
  • @swinefeaster:非同期モディファイアを含めた場合、最初のバージョンは本当にコンパイルされます。あなたはやったことがありますか?コンピュータに戻ったときにもう一度確認します。 - Jon Skeet
  • @swinefeaster:試してみただけで、問題ありません。override基本クラスのメソッドをオーバーライドするのではなく、インターフェイスを実装しているためです。私はCS0161を持っていないのにasync変更。 - Jon Skeet
  • ああ、あなたは正しいです!非同期モディファイアがありませんでした。乾杯! - swinefeaster
  • だが、それから私は次のような警告を受ける。"この非同期メソッドには欠けている'演算子と同期的に実行されます。 ' await'の使用を検討してください。ノンブロッキングAPI呼び出しを待つオペレータ、またはTask.Run(...)を待つ'バックグラウンドスレッドでCPUバウンドの作業を行うことができます。」 - swinefeaster

リンクされた質問


関連する質問

最近の質問