2011-06-24 22 views
3

には、次のC#コードを考えてみましょう:vb.netでBackgroundWorkerを使用してラムダ式でコードをラップする方法は?

private void SomeMethod() 
{ 
    IsBusy = true; 
    var bg = new BackgroundWorker(); 
    bg.DoWork += (sender, e) => 
    { 
     //do some work 
    }; 
    bg.RunWorkerCompleted += (sender, e) => 
    { 
     IsBusy = false; 
    }; 
    bg.RunWorkerAsync(); 
} 

私はVB.NETを直接Private WithEvents Worker As BackgroundWorkerを言うと、以下のように明示的にDoWorkイベントを処理することにより、セットアップにあなたが持っている労働者をそのようDoWorkを参照し、許可されません知っている:

Private Sub Worker_DoWork( 
      ByVal sender As Object, 
      ByVal e As DoWorkEventArgs) _ 
      Handles Worker.DoWork 

    ... 

End Sub 

しかし、私はVB.netのC#の例からSomeMethodのようなメソッドを実装できるようにしたいと思います。これは、Backgroundworkerを別のクラス(これは依存性注入と単体テストのためにやりたいことです)にラップすることを意味します。私はシンプルでエレガントな方法でそれについてどうやって行くのか分かりません。

答えて

4

あなた直接AddHandlerキーワードを使用してC#で同じようDoWorkを参照することができます。VB10で、この唯一の作品は、VBの以前のバージョンでは、複数文のラムダをサポートしていないようことを

AddHandler bg.DoWork, Sub(sender, e) 
          DoSomething() 
         End Sub 
AddHandler bg.RunWorkerCompleted, Sub(sender, e) 
             IsBusy = False 
            End Sub 
bg.RunWorkerAsync() 

注意を。

+0

@Svenについては、.NET 4のヒントはあまり正確ではありません。これは必須の.NET 4ではなく、.NET 4/Visual Studio 2010に同梱されているVB.NETコンパイラの最新バージョン(バージョン10)です。ただし、コンパイラによって生成された*コードは.NETでも実行する必要があります2.0アプリケーション。 – stakx

+0

はい、私はそれを変えるために私の答えを編集したのは知っています。 :)また、私は最初に受け入れられましたか?人生は公正ではありません。 :P – Sven

+0

@スヴェン、私はあなたが最初であることを認識していませんでした(どちらも答えたx分前です)。私はあなたに+1を与えました。 – Matt

5

あなたは(のVisual Studio 2010が付属しています)VB.NET 10を使用している場合は、以下が正常に動作する必要があります:

Dim bg = New BackgroundWorker() 
AddHandler bg.DoWork, 
    Sub() 
     DoSomething() 
    End Sub 
AddHandler bg.RunWorkerCompleted, 
    Sub() 
     IsBusy = False 
    End Sub 
bg.RunWorkerAsync() 

VB.NETの以前のバージョンがしたので、VB.NET 10が、ここで必要とされます複数の行にまたがるlambdas(匿名Sub)は許可しないでください。

上記のコードはCLRのバージョン2と互換性があるため、以前のバージョンの.NET Frameworkを対象とすることができます。

+0

ありがとう!バックグラウンドワーカーに関するVBで見たすべての例では、このようなハンドラーを使用せず、代わりにメソッドのアプローチを使用しました。これをクリアしていただきありがとうございます。はい、私はVS2010を使用しています(最近始まったばかりです)。 – Matt

+0

@Matt、その場合は、インライン 'Sub'sでパラメータを省略することができます。私の答えに表示されるイベントハンドラは、通常のイベントハンドラパラメータの' sender'と 'e'を省略します。 *これらの引数にアクセスする必要がある場合は 'Sub(sender、e)...'と書くことができます。 – stakx

+1

@stalx、ありがとう、私はあなたもそれらを省略することができるか分からなかった。しかし、私は言ったときに: 'AddHandler bg.ProgressChanged、Sub(sender、e)'私は、System.ComponentModel.ProgressChangedEventArgsとしてVSがeを言っているが、私はラムダでeを使うとき、それは型オブジェクトであることに気づいた。私は明示的にパラメータを宣言(またはキャスト)して正しい型として機能させる必要があります。明示的に宣言されていないときにラムダシグネチャの外にあるものがVBで認識されないのはなぜですか? – Matt

関連する問題