无法声明接口“异步任务<myobject> MyMethod(对象myObj);”</myobject>

时间:2012-10-24 12:21:58

标签: c# compiler-construction interface async-await asp.net-4.5

我无法宣布

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

编译器告诉我:

  • 修饰符异步对此项目无效
  • async修饰符只能用于具有正文
  • 的方法

这是应该实施的,还是async&amp;的性质?等待禁止这种情况发生?

4 个答案:

答案 0 :(得分:54)

  

是否使用async / await实现方法是一种方法   实施细节。该方法应该如何表现是一种契约   细节,应以正常方式指定。

     

请注意,如果您让方法返回TaskTask<T>,则会更多   很明显,它意味着异步,并且可能很难   实现而不是异步。

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

答案 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及更高版本)

另请参阅:Return Task<bool> instantly

答案 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() 可以并且很可能是异步的。