C# 接口定义了非异步版本,但实现需要调用异步方法,这会导致接口未实现错误
我有一个简单的界面:C# 接口定义了非异步版本,但实现需要调用异步方法,这会导致接口未实现错误,c#,async-await,C#,Async Await,我有一个简单的界面: public interface IValidation { string Validate(); } public interface IValidation { Task<string> Validate(); } 其中一个实现需要一个具有异步方法的依赖项,我得到编译错误:await运算符只能在异步方法中使用 public class Foo : IValidation { private IAuthorizationServic
public interface IValidation
{
string Validate();
}
public interface IValidation
{
Task<string> Validate();
}
其中一个实现需要一个具有异步方法的依赖项,我得到编译错误:await运算符只能在异步方法中使用
public class Foo : IValidation
{
private IAuthorizationService _authorizationSvc { get; }
public Foo(IAuthorizationService authorizationSvc)
{
_authorizationSvc = authorizationSvc;
}
public string Validate()
{
var result = await _authorizationSvc.ValidateAuthorizationAsync(validationParams);
}
}
当我像这样更改实现时,我得到一个不同的错误:“Foo没有实现接口成员‘IValidation.Validate’
”
公共类Foo:IValidation
{
私有IAAuthorizationService_authorizationSvc{get;}
公共Foo(IAAuthorizationService授权SVC)
{
_authorizationSvc=authorizationSvc;
}
公共异步任务验证()
{
var result=await_authorizationSvc.ValidateAuthorizationAsync(validationParams);
}
}
请提供如何修复此问题
谢谢 理想情况下,我怀疑您会更新界面:
public interface IValidation
{
string Validate();
}
public interface IValidation
{
Task<string> Validate();
}
您可以自行承担风险,尝试以下方法:
public async Task<string> Validate()
{
var capturedSynchronizationContext = SynchronizationContext.Current;
try
{
SynchronizationContext.SetSynchronizationContext(null);
var result = _authorizationSvc
.ValidateAuthorizationAsync(validationParams)
.GetAwaiter().GetResult();
}
finally
{
SynchronizationContext.SetSynchronizationContext(capturedSynchronizationContext);
}
}
公共异步任务验证()
{
var capturedSynchronizationContext=SynchronizationContext.Current;
尝试
{
SynchronizationContext.SetSynchronizationContext(空);
var结果=\u授权SVC
.ValidateAuthorizationAsync(validationParams)
.GetAwaiter().GetResult();
}
最后
{
SynchronizationContext.SetSynchronizationContext(capturedSynchronizationContext);
}
}
如果这对您的系统没有影响,您需要非常仔细地进行评估。“为了一致性,他们也会使用异步方法”,是吗?方法不需要异步才能返回
任务
@Joelius:fairpoint。我想,作为wait Task.Yield()
的替代方法,他们可能会使用类似return Task.FromResult(someValue)
的东西。是的,这会更理想,因为您可以避免内部状态机。“如何解决这个问题”,解决这个问题的方法不止一种。基本上,为了从同步方法调用异步方法,您必须使用.GetAwaiter().GetResult()
,并且希望这不会死锁,否则您必须使想要等待的方法也成为异步的。