我无法申报
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
编译器告诉我:
- 修饰符 async 对此项目无效
- async 修饰符只能用于具有主体的方法
这是应该实施的事情,还是 async & await 的性质禁止这种情况发生?
我无法申报
interface IMyInterface
{
async Task<myObject> MyMethod(Object myObj);
}
编译器告诉我:
这是应该实施的事情,还是 async & await 的性质禁止这种情况发生?
是否使用
async
/await
是否 实现方法是实现细节。该方法的行为方式是合同细节,应该以正常方式指定。请注意,如果您使方法返回 a
Task
或 aTask<T>
,则更明显的是它是异步的,并且如果不异步可能很难实现。
无论您的实现是否异步,都与您的界面无关。换句话说,接口不能指定给定方法必须以异步方式实现。
只需async
从您的界面中取出,它就会编译;然而,没有办法仅仅通过指定一个接口来强制执行异步实现。
如果您有一个具有两个实现的接口(一个是真正异步的,另一个是同步的),这就是每个实现的样子——两者都返回一个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()
可以并且可能会是异步的。