宣言できない
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
コンパイラは私に教えてくれます:
- 修飾子 async はこのアイテムには無効です
- async 修飾子は、本体を持つメソッドにのみ使用できます
これは実装する必要があるものですか、それとも async & await の性質上、これが発生することはありませんか?
宣言できない
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
コンパイラは私に教えてくれます:
これは実装する必要があるものですか、それとも async & await の性質上、これが発生することはありませんか?
メソッドが
async
/を使用して実装されるかどうかawait
は、 実装の詳細です。メソッドの動作はコントラクトの詳細であり、通常の方法で指定する必要があります。
Task
メソッドにaまたはaを返すようにするTask<T>
と、非同期であることがより明確になり、非同期でないと実装が困難になる可能性があることに注意してください。
実装が非同期であるかどうかに関係なく、インターフェースとは関係ありません。つまり、インターフェイスは、特定のメソッドを非同期で実装する必要があることを指定できません。
インターフェイスを取り出すだけasync
でコンパイルされます。ただし、インターフェイスを指定するだけで非同期実装を強制する方法はありません。
2 つの実装 (真に非同期な実装と同期的な実装) を備えたインターフェイスがある場合、各実装は次のようになります。どちらも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> を即座に返す
async
修飾子は「実装の詳細」であり、メソッドが非同期的に処理する方法に影響を与えますが、そうするかどうかには影響しません。
そのasync
ため、インターフェイス内にビジネスはありません。
interface IService { Task DoSomethingAsync(); }
class A : IService { public async Task DoSomethingAsync() { ... } }
class B : IService { public Task DoSomethingAsync() { ... } }
クラス A と B はどちらも完全に有効です。どちらの方法も待機可能です。インターフェイスの消費者は、使用するかどうかを知りませんasync
。
B.DoSomethingAsync()
非同期になる可能性があり、おそらく非同期になります。