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;
  }
}

注 - このインターフェイスを実装するクラスの一部は実際には非同期であるため、Task を完全に削除することはできません。

ありがとう

4

1 に答える 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);
}
于 2012-11-23T07:38:22.800 に答える