46

宣言できません

interface IMyInterface
{
   async Task<myObject> MyMethod(Object myObj);
}

コンパイラは私に言う:

  • このアイテムには修飾子asyncは無効です
  • 非同期修飾子は、本体を持つメソッドにのみ使用できます。

これは実装すべきものなのか、それとも非同期の性質を持つのか?これがこれまでに発生しないように禁止しますか?

3 답변


51

メソッドがasync / awaitを使って実装されているかどうかは、   実装の詳細メソッドの動作方法は契約です   detail、通常の方法で指定する必要があります。

あなたがメソッドを返すようにすると注意してくださいTaskまたはTask<T>もっと   非同期であることを意味していることは明らかで、おそらく難しいでしょう   非同期にせずに実装する。

からhttps://stackoverflow.com/a/6274601/43846


  • Jon Skeetのための+1は言う:) - Noctis

16

あなたの実装が非同期であるかどうかにかかわらず、あなたのインターフェースとは関係ありません。言い換えれば、インタフェースは、与えられたメソッドが非同期的に実装されなければならないことを指定することはできません。

取るだけasyncあなたのインターフェースの外でそれはコンパイルされます。しかし、インターフェースを指定するだけでは非同期実装を強制する方法はありません。


4

2つの実装(1つは真に非同期、もう1つは同期)とのインターフェースを持っている場合、これは各実装に対して次のようになります。Task<bool>

public interface IUserManager
{
    Task<bool> IsUserInRole(string roleName);
}

public class UserManager1
{
    public async Task<bool> IsUserInRole(string roleName)
    {
        return await _userManager.IsInRoleAsync(_profile.Id, roleName);
    }
}

public class UserManager2
{
    public Task<bool> IsUserInRole(string roleName)
    {
        return Task.FromResult(Roles.IsUserInRole(roleName));
    }
}

それが無効な方法である場合、あなたはする必要がありますreturn Task.CompletedTask;非非同期メソッドから (私は.NET 4.5以降と思います)

また見なさい:タスクを返す< bool>瞬時に


  • あなたはクラス定義でインターフェースを実装するのを忘れました。 - SutharMonil

リンクされた質問


関連する質問

最近の質問