我无法宣布
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
编译器告诉我:
这是应该实施的,还是async&amp;的性质?等待禁止这种情况发生?
答案 0 :(得分:54)
是否使用async / await实现方法是一种方法 实施细节。该方法应该如何表现是一种契约 细节,应以正常方式指定。
请注意,如果您让方法返回
Task
或Task<T>
,则会更多 很明显,它意味着异步,并且可能很难 实现而不是异步。
答案 1 :(得分:17)
您的实现是否异步,与您的界面无关。换句话说,接口不能指定必须以异步方式实现给定方法。
只需从您的界面中取出async
即可编译;但是,仅通过指定接口就无法强制执行异步实现。
答案 2 :(得分:5)
如果你有一个具有两个实现的接口(一个是真正异步的,另一个是同步的),这就是每个实现的样子 - 两者都返回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及更高版本)
答案 3 :(得分:0)
async
修饰符是一个“实现细节”,它影响方法如何异步执行操作,而不是如果这样做。
所以 async
在界面内没有业务。
interface IService { Task DoSomethingAsync(); }
class A : IService { public async Task DoSomethingAsync() { ... } }
class B : IService { public Task DoSomethingAsync() { ... } }
A 类和 B 类都完全有效。两种方法都可以等待。接口的使用者不知道或不关心他们是否使用 async
。
B.DoSomethingAsync()
可以并且很可能是异步的。