接口可以提供同步和异步方法的方法吗?

时间:2018-03-10 18:59:34

标签: c# async-await

如何使用异步和同步方法创建类接口?

我正在创建一个实现的接口服务:

public Interface IService<T> where T : class{
    T Get(int id);
    bool Add(T entity);
    bool Remove(int id);
    bool Update(T entity);
}

但是应用程序上下文中的某些操作是异步方法,例如: UserManager类中的userManager.CreateAsync(user, password)

然后我有两个选择。

  1. 使用...GetAwaiter().GetResult();在同步方法中进行异步调用。
  2. 将整个应用程序和我的界面设为异步Tasl<bool> async Add(T entity){ ... }
  3. 他们两个都有自己的问题。

    1. ...GetAwaiter().GetResult();可能会产生一些不受欢迎的死锁,如here
    2. 所述
    3. 我需要让所有方法链接为异步。
    4. 接口是否可以提供同步和异步方法的方法?

2 个答案:

答案 0 :(得分:5)

异步方法只是返回Task而不是原始值的方法。就这样。当然,如果需要,您可以让界面包含void Update()Task UpdateAsync(),从而支持同步和异步操作。

但是,这不一定是最好的行动方案。如果您的操作依赖于异步操作,例如您的CreateUserAsync示例,那么用于将它们转换为同步操作的代码可能会非常危险。异步代码最好是一直异步up,并让原始调用者决定何时等待。

当你说“两个[选项]都有自己的问题”时,比如说,但当你拼出它们时,很明显它们并不是真正平等的问题。 “可以在运行时生成死锁”与“需要重写更多我的代码为异步”对我来说是一个明智的选择。一路走异步。

答案 1 :(得分:1)

让开发人员工作室为您提取界面,您就会看到答案

class MyClass
{
    public async Task<int> GetValueAsync(int i)
    {
        await Task.Delay(TimeSpan.FromSeconds(1));
        return i;
    }
}

右键单击MyClass。选择&#34;快速行动和重构&#34;并让它为您创建一个界面。结果如下:

interface IMyClass
{
    Task<int> GetValueAsync(int i);
}

我想这会回答你的问题