结合任务和IAsyncResult

时间:2015-08-07 08:36:17

标签: c# wcf async-await task

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

private static async Task<bool> AauthorizeAsync(string[] claims)

我做了类似这样的事情,但是在异常执行没有继续,似乎调用线程没有收到任何反馈并保持孤立。

public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
    return AauthorizeAsync(_claims)
        .ContinueWith(task =>
                      {
                          var authorized = task.Result;

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

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

工作代码就是这样,但是已经同步了。如何将其转换为完全异步?

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);
}

1 个答案:

答案 0 :(得分:2)

您无需使用异步IOperationInvoker。您可以使用同步操作,但仍然具有异步操作。这可能是最简单的行动方式。

如果您想要异步,则需要使用IAsyncResult返回的_defaultInvoker.InvokeBegin(instance, inputs, callback, state);。现在,这个价值再也没有看过了。

使用Task.FromAsync从中创建任务。然后,您可以返回该任务并致电Unwrap。使用await会更容易。 ContinueWith应该是代码气味。

var authorized = await AauthorizeAsync(_claims);

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

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

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