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

Dan*_*tos 0 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);
}
Run Code Online (Sandbox Code Playgroud)

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

然后我有2个选择.

  1. 用于...GetAwaiter().GetResult(); 在同步方法中进行异步调用.
  2. 使整个应用程序和我的界面异步 Tasl<bool> async Add(T entity){ ... }

他们两个都有自己的问题.

  1. ...GetAwaiter().GetResult();可以产生一些不希望的死锁,如这里所说
  2. 我需要让所有方法链接到异步.

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

Avn*_*tan 6

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

但是,这不一定是最好的行动方案.如果您的操作依赖于异步操作(例如您的CreateUserAsync示例),则用于将其转换为同步操作的代码可能会非常危险.异步代码最好是异步一路送达起来,并让上时,等待原主叫方决定.

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