如何使用异步和同步方法创建类接口?
我正在创建一个实现的接口服务:
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)
。
然后我有两个选择。
...GetAwaiter().GetResult();
在同步方法中进行异步调用。Tasl<bool> async Add(T entity){ ... }
他们两个都有自己的问题。
...GetAwaiter().GetResult();
可能会产生一些不受欢迎的死锁,如here 接口是否可以提供同步和异步方法的方法?
答案 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);
}
我想这会回答你的问题