c# - 接口(interface)可以为 Sync 和 Async 方法提供方法吗?

标签 c# async-await

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

我正在创建一个实现以下功能的接口(interface)服务:

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

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

然后我有两个选择。

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

他们都有自己的问题。

  1. ...GetAwaiter().GetResult();可以产生一些不需要的死锁,如前所述 here
  2. 我需要将所有方法链接起来成为异步的。

接口(interface)是否可以提供同步和异步方法?

最佳答案

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

但是,这不一定是最好的做法。如果您的操作依赖于异步操作,例如您的 CreateUserAsync 示例,则您用来将它们转换为同步操作的代码可能不稳定且危险。异步代码最适合一直异步 up ,并让原始调用者决定何时等待。

当您说“两个 [选项] 都有自己的问题”时,但是当您将它们拼写出来时,很明显它们并不是真正相同的问题。 “可以在运行时产生死锁”与“需要重写我的更多异步代码”对我来说是一个无需思考的问题。一路异步。

关于c# - 接口(interface)可以为 Sync 和 Async 方法提供方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212881/

相关文章:

c# - 如何检查特定时间是否已过

c# - Unity 3D - 在世界/平面之间转换?

c# - 为什么对 CPU 绑定(bind)任务使用 C# async/await

.net - .net核心中是否有DBSet.UpdateAsync()和RemoveAsync()?

c# - 取消 ContinueWith 任务链并向调用者报告错误

c# - 无法在映射器中映射属性

c# - OWIN SelfHost Web Api - 请求取消 - 它是如何完成的?线程中止?

c# - 如何对 Create POST 进行单元测试?

c# - 使用 PushStreamContent 从 HTTPClient 上传

c# - 如何在C#中成功下载一个.exe文件?