首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合任务和IAsyncResult

结合任务和IAsyncResult
EN

Stack Overflow用户
提问于 2015-08-07 16:36:17
回答 1查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
private static async Task<bool> AauthorizeAsync(string[] claims)

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

代码语言:javascript
复制
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);
                      });
}

工作代码是这样的,但它是同步的。如何将其转换为完全异步?

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-07 18:51:21

您不需要使用异步IOperationInvoker。您可以使用同步操作,但仍然可以使用异步操作。这可能是最简单的行动方案。

如果你想要一个异步的,你需要使用_defaultInvoker.InvokeBegin(instance, inputs, callback, state);返回的IAsyncResult。现在,这个值再也不会被查看了。

使用Task.FromAsync从它创建任务。然后,您可以返回该任务并调用Unwrap。如果你使用await,那就更简单了。ContinueWith应该是一种代码味道。

代码语言:javascript
复制
var authorized = await AauthorizeAsync(_claims);

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31873187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档