C# 结合任务和IAsyncResult

C# 结合任务和IAsyncResult,c#,wcf,async-await,task,C#,Wcf,Async Await,Task,在WCF中,通过实现IOperationInvoker我试图在调用实际方法之前测试调用方是否被授权。但我想用异步的方式来做,因为我的方法都是异步的。 问题是我不知道如何将任务和IAsyncResult组合在一起。 在InvokeBegin中,首先我要检查授权,然后返回原始方法的调用。 我的AauthorizeAsync方法定义如下: private static async Task<bool> AauthorizeAsync(string[] claims) 工作代码如下,但已同

在WCF中,通过实现
IOperationInvoker
我试图在调用实际方法之前测试调用方是否被授权。但我想用异步的方式来做,因为我的方法都是异步的。 问题是我不知道如何将
任务
IAsyncResult
组合在一起。 在
InvokeBegin
中,首先我要检查授权,然后返回原始方法的调用。 我的
AauthorizeAsync
方法定义如下:

private static async Task<bool> AauthorizeAsync(string[] claims)
工作代码如下,但已同步。如何将其转换为完全异步

public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
    var authorized = AauthorizeAsync(_claims).GetAwaiter().GetResult();

    if (!authorized)
    {
        throw new WebFaultException(HttpStatusCode.Unauthorized);
    }

    return _defaultInvoker.InvokeBegin(instance, inputs, callback, state);
}

public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
    return _defaultInvoker.InvokeEnd(instance, out outputs, result);
}

您不需要使用异步
IOperationInvoker
。您可以使用同步操作,但仍有异步操作。这可能是最简单的做法

如果您想要一个异步的,您需要使用从
\u defaultInvoker.InvokeBegin(实例、输入、回调、状态)返回的
IAsyncResult
。现在,这个值再也看不到了

使用
Task.fromsync
从中创建任务。然后,您可以返回该任务并调用
Unwrap
。如果使用
wait
,则更容易<代码>继续与
应为代码气味

var authorized = await AauthorizeAsync(_claims);

if (!authorized)
{
    throw new WebFaultException(HttpStatusCode.Unauthorized);
}

await Task.FromAsync(..., _defaultInvoker.InvokeBegin(instance, inputs, callback, state), ...);

这必须采用新的
async
方法。然后,生成的任务可以充当一个包含所有内容的
IAsyncResult

首先为什么要使用
IAsyncResult
?为什么不在WCF中生成基于任务的异步方法呢?这是WCF的IOperationInvoker的要求,有点旧了。:)@SametSorgut您找到这个问题的解决方案了吗?Task.Factory.FromAsync()需要同时指定InvokeBegin和InvokeEnd方法。我无法在此处指定InvokeEnd。它已被调用方对象调用。它将是您可以调用的
\u defaultInvoker.InvokeEnd
。您的调用者不需要以任何方式了解
\u defaultInvoker
。您可以封装该调用。
var authorized = await AauthorizeAsync(_claims);

if (!authorized)
{
    throw new WebFaultException(HttpStatusCode.Unauthorized);
}

await Task.FromAsync(..., _defaultInvoker.InvokeBegin(instance, inputs, callback, state), ...);