62

我无法申报

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

编译器告诉我:

  • 修饰符 async 对此项目无效
  • async 修饰符只能用于具有主体的方法

这是应该实施的事情,还是 async & await 的性质禁止这种情况发生?

4

4 回答 4

68

是否使用async/await是否 实现方法是实现细节。该方法的行为方式是合同细节,应该以正常方式指定。

请注意,如果您使方法返回 aTask或 a Task<T>,则更明显的是它是异步的,并且如果不异步可能很难实现。

来自https://stackoverflow.com/a/6274601/4384

于 2012-10-24T12:24:41.413 回答
20

无论您的实现是否异步,都与您的界面无关。换句话说,接口不能指定给定方法必须以异步方式实现。

只需async从您的界面中取出,它就会编译;然而,没有办法仅仅通过指定一个接口来强制执行异步实现。

于 2012-10-24T12:25:55.710 回答
7

如果您有一个具有两个实现的接口(一个是真正异步的,另一个是同步的),这就是每个实现的样子——两者都返回一个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>

于 2017-12-08T21:30:06.970 回答
1

async修饰符是一个“实现细节”,它影响方法如何异步执行操作,而不是如果它这样做。

因此async,在接口内部没有任何业务。

interface IService { Task DoSomethingAsync(); }

class A : IService { public async Task DoSomethingAsync() { ... } }

class B : IService { public Task DoSomethingAsync() { ... } }

A 类和 B 类都是完全有效的。两种方法都可以等待。接口的使用者不知道也不关心他们是否使用async.

B.DoSomethingAsync()可以并且可能会是异步的。

于 2021-07-14T21:49:23.757 回答