2017-03-29 2 views
0

非同期呼び出しを行い、データセットを取り戻すC#コードがあります。私はこれを行うので、WindowsのデスクトップUIは、ハングしていない/フリーズ中に取得されています。私は今、VB.NETで同じことをする必要があるが、それは私にエラーを与えるオンラインコードコンバータを介して入れた後。C#からVBへのコードコンバータを使用して正しく渡されない非同期スレッディング

Delegate 'Func(Of String、Boolean、DataSet)'では、コンストラクタの唯一の引数として 'AddressOf'式またはラムダ式が必要です。

変換前と変換後のコードです。後

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

行うことには、2つの修正があります。

  1. varと呼ばれるいかなるデータ型がありません。この場合、As var =As Newに置き換えることができます。

  2. エラー状態として、代理人を作成するには、コンストラクタに渡すメソッドの先頭にAddressOfを追加する必要があります。

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

良い答えですが、推測されたタイピングの通常のVBの同等物は 'Option Dim DataFunc = ... –

+1

2012年以降の実際の等価物は 'Dim result = Await Task.Run(Function()getData(barCodeResult、orderType))'となります。 –

+0

@DaveDoknjas:私は最初はそれを持っていましたが、編集履歴が始まる5分前に編集しました。 –

関連する問題