如何使部分方法异步

时间:2018-10-22 19:12:08

标签: c# asynchronous auto-generate

我有使用部分方法生成的代码

{
    ...
    partial void InterceptOperationCall(IOperationContext context);
    ...

    async Task SomeMethod()
    {
        InterceptOperationCall(cntx);
        await LongOperation(cntx);
    }
}

和手写的部分

{
    partial void InterceptOperationCall(IOperationContext context)
    {
    }
}

我需要在InterceptOperationCall内部进行异步调用,是否有人知道解决部分方法限制的某种方法?

换句话说: 我想异步执行InterceptOperationCall并保证在长时间操作之前,与此同时,我想在另一个文件中可选地声明此方法的主体。

UPD 作为我选择的解决方法:

  • 不使用生成的部分方法存根,而是使用动态代理(Castle.DynamicProxy)包装并使用 {{1}中的AsyncInterceptorBase
  • 我看到的另一个选项是重写代码生成器

无论如何,我一直在寻找更好的解决方案,如果有人知道另一种方法来提供可选的功能来封装带有somoe异步逻辑的异步调用,请帮帮我。

3 个答案:

答案 0 :(得分:1)

部分方法就像接口。他们是合同。像接口方法一样,实现部分方法的任何人都在履行该契约。在这种情况下,方法的约定是同步方法。无法使用异步实现,因为该方法的正确异步实现要求该方法的调用者知道它是一个异步方法,并采取相应的行动。由于调用方将合同写为一种同步方法,因此不会发生。

因此,您的解决方案是将方法的协定更改为异步,这意味着更改部分方法的声明,或者提供同步而非异步的实现。

我想第三个选择是使接口(在这种情况下为部分方法)同时支持两者。有两种部分方法,一种异步,一种同步,让实现提供他们想要的任何一种。

答案 1 :(得分:0)

实现局部方法时,可以使用async关键字。

所以

async partial void InterceptOperationCall(IOperationContext context) {

}

应该没问题。

答案 2 :(得分:0)

我认为,没有一种方法可以解决所有异步无效的缺陷(正如彼得·施耐德(Peter Schneider)评论中链接的史蒂芬·克莱伊(Stephen Cleary)所讨论的那样)

我认为,如果您找不到或编写有问题的异步API的同步版本,最好的选择是调用异步方法,然后使用task.Wait()等待完成。如果您有多个异步调用,请使用ContinueWith组合它们。本质上,您需要使用.Net 4.0样式的Task库。