2017-04-09 40 views
-1

我需要從NavigateError事件,它的簽名(見下文)調用await方法我不能改變:從ref pameters的方法調用await方法?

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

將其標記爲async,所以我會做:

await myMethod(foo); 

給錯誤:

Error CS1988 Async methods cannot have ref or out parameters

我該如何解決這個問題?

+6

你的問題閱讀裁判的參數是:「我需要做的事情是不可能的,我該怎麼辦呢?」你沒有。要麼你不需要*等待,或者你不需要*擁有參考。如果你同時需要,那麼你需要*學習如何忍受不滿足你需求的失望。 –

+0

是否有你使用ActiveX組件而不是[Winforms]的原因(https://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser(v = vs.110).aspx )或[WPF](https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser(v = vs.110).aspx)組件? –

+0

@EricLippert:我正在尋找解決方法,如果有的話。如果我確信這是不可能的,我不會問,因爲我很愚蠢。 – Jack

回答

1

有沒有辦法使用async/await來做到這一點。由於異步方法的工作方式,在異步方法中使用ref/out將毫無意義。

您沒有指定myMethod的簽名,所以下面的示例假定您需要異步方法的返回值。如果您不需要等待該方法完成,則可以將其稱爲正常方法: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 
    }); 
} 
+0

'ContinueWith()'看起來真的很順利。謝謝! – Jack

+2

@Jack:在這裏等一下:你說你需要等待。等待是工作流程中的一個要點,工作流程必須*暫停*直到等待結果可用*。 'ContinueWith'註冊了延續,我們知道延續在任務完成之前不會被激活,但如果您需要*處理程序*來暫停*它的工作直到任務完成,那麼您就沒有*目標。 (因爲它*不可能*)。 –