2017-03-29 65 views
0

我有一些C#代碼正在做異步調用並拉回數據集。我這樣做是爲了讓Windows桌面用戶界面在檢索時不掛起/凍結。我現在需要在vb.net中做同樣的事情,但通過在線代碼轉換器後,它給了我錯誤。異步線程是不正確使用C#代碼轉換器VB到VB

委託'Func(Of String,Boolean,DataSet)'需要'AddressOf'表達式或lambda表達式作爲其構造函數的唯一參數。

這是轉換前後的代碼。

前:

var DataFunc = new Func<string, string, DataSet> (getData); 

IAsyncResult Result = DataFunc.BeginInvoke(barCodeResult, orderType, null, null); 

DataSet ds = DataFunc.EndInvoke(Result); 

後:

Dim DataFunc As var = New Func(Of String, String, DataSet)(getData) 

Dim Result As IAsyncResult = DataFunc.BeginInvoke(barCodeResult, orderType, Nothing, Nothing) 

Dim ds As DataSet = mtrDataFunc.EndInvoke(Result) 

非常感謝你提前爲您的見解。

+1

你應該明白的語言,而不是使用轉換器。幾乎所有的.NET代碼都是用C#編寫的。原來的C#代碼*不是*很好。我懷疑它是從一個非常古老的項目中複製而來的。你可以用'var result = await Task.Run((=)getData(barCodeResult,orderType));'替換它。在VB.NET中的等價物是'Dim result = Await Task.Run(Function()getData(barCodeResult,orderType))' –

+0

getData是做什麼的?如果函數阻塞等待數據庫響應,則在後臺運行任何內容都沒有意義。 ADO.NET本身支持異步操作。例如,'SqlCommand.ExecuteReaderAsync'可用於異步返回讀者 –

+0

如果我的答案解決了您的問題,請按下我的文章左側的勾號/複選標記將其標記爲「已接受」。欲瞭解更多信息,請參閱:[**如何接受答案的工作**](https://meta.stackexchange.com/a/5235) –

回答

1

有兩種修復被提出:

  1. 有沒有叫var數據類型。在這種情況下,您可以用As New替換As var =

  2. 由於錯誤狀態,您傳遞給Func構造函數的方法必須以AddressOf作爲前綴來創建委託。

    Dim DataFunc As New Func(Of String, String, DataSet)(AddressOf getData) 
    
+2

好的答案,但通常的VB推斷類型的等效是使用'選項Infer On',然後省略類型:Dim DataFunc = ... –

+1

自2012年起的實際等效項目爲'Dim result = Await Task.Run(Function()getData(barCodeResult,orderType))'。 –

+0

@DaveDoknjas:起初我有這種感覺,但是在編輯歷史開始之前的5分鐘內對它進行了編輯。 –