宣言できない
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
コンパイラは私に言う:
これは実装すべきものですか、それとも非同期と待機の性質がこれが発生するのを禁止していますか?
メソッドがasync/awaitを使用して実装されるかどうかは、実装の詳細です。メソッドの動作方法はコントラクトの詳細であり、通常の方法で指定する必要があります。
メソッドが
Task
またはTask<T>
を返すようにした場合、非同期であることを意図していることは明らかであり、おそらく非同期でないと実装が難しいことに注意してください。
実装が非同期であるかどうかにかかわらず、インターフェイスとは無関係です。つまり、インターフェイスは、特定のメソッドを非同期的に実装する必要があることを指定できません。
インターフェイスからasync
を取り出すと、コンパイルされます。ただし、インターフェイスを指定するだけでは非同期実装を強制する方法はありません。
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以降と思います)