从具有ref pameters的方法调用await方法?

时间:2017-04-09 20:36:46

标签: c# asynchronous async-await ref

我需要从NavigateError事件调用await方法,其签名(见下文)我无法更改:

void instance_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel);

将其标记为async所以我会这样做:

await myMethod(foo);

给出错误:

  

错误CS1988异步方法不能有ref或out参数

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用async / await无法做到这一点。由于异步方法的工作原理,在异步方法中使用ref / out是没有意义的。

您没有指定myMethod的签名,因此下面的示例假定您需要async方法的返回值。如果您不需要等待方法完成,您可以像普通方法一样调用它:myMethod(foo)。请注意,myMethod中引发的任何异常都将被忽略。

解决方法是手动输入.ContinueWith。因为这需要使用lambda(或单独的方法),所以在调用之后你将无法设置ref参数。

private void instance_NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
{
    myMethod(foo).ContinueWith(t => {
        var resultOfMethod = t.Result;

        // Do something with resultOfMethod
    });
}

您可以通过将参数放在变量中来读取参数

private void instance_NavigateError(object pDisp, ref object URLref, ref object Frame, ref object StatusCode, ref bool Cancel)
{
    var URL = URLref;
    myMethod(foo).ContinueWith(t => {
        var resultOfMethod = t.Result;

        // Do something with resultOfMethod and URL
    });
}