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()
,并且希望这不会死锁,否则您必须使想要等待的方法也成为异步的。