web-dev-qa-db-ja.com

インターフェイス「async Task <myObject> MyMethod(Object myObj);」を宣言できません

宣言できない

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

コンパイラは私に言う:

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

これは実装すべきものですか、それとも非同期と待機の性質がこれが発生するのを禁止していますか?

48

メソッドがasync/awaitを使用して実装されるかどうかは、実装の詳細です。メソッドの動作方法はコントラクトの詳細であり、通常の方法で指定する必要があります。

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

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

58
stuartd

実装が非同期であるかどうかにかかわらず、インターフェイスとは無関係です。つまり、インターフェイスは、特定のメソッドを非同期的に実装する必要があることを指定できません。

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

17
Roy Dictus

2つの実装(1つは完全に非同期で、もう1つは同期)を持つインターフェイスがある場合、これは各実装でどのように見えるかです-両方ともTask<bool>を返します。

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

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

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

Voidメソッドの場合、非同期でないメソッドからreturn Task.CompletedTask;する必要があります(.NET 4.5以降と思います)

参照: Task <bool>を即座に返す

5
Simon_Weaver