匿名メソッドを使用してBackgroundWorkerを作成します。
私は次のコードを書きました:
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(
() =>
{
int i = 0;
foreach (var item in query2)
{
....
....
}
}
);
しかしDelegate'System.ComponentModel.DoWorkEventHandler 'は' 0 '引数を取りませんそして私は2つのオブジェクトをに渡す必要があります匿名メソッド:オブジェクト送信者、DoWorkEventArgs e
どうすればいいのか教えていただけませんか?ありがとう。
匿名関数にパラメーターを追加する必要があります。
bgw.DoWork += (sender, e) => { ... }
または、パラメータを気にしない場合は、次のことができます。
bgw.DoWork += delegate { ... }
ラムダを指定する場合は、同じ数の引数を取るようにする必要があります。
bgw.DoWork += (s, e) => ...;
ただし、引数を使用していない場合は、パラメーターなしで匿名デリゲートを使用できます。
bgw.DoWork += delegate
{
...
};
ラムダなしで上記を記述した場合、どのようになりますか?
backgroundWorker1.DoWork +=
new DoWorkEventHandler(backgroundWorker1_DoWork);
および名前付きメソッド:
private void backgroundWorker1_DoWork(object sender,
DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
// Assign the result of the computation
// to the Result property of the DoWorkEventArgs
// object. This is will be available to the
// RunWorkerCompleted eventhandler.
e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
しかし、今は束縛変数のないラムダを使用しています()=> 2つのオブジェクトsenderとeを指定する必要があります(これらは後で型が推測されます)。
backgroundWorker1.DoWork += (sender, e) => ...
ラムダ式は、コードを短くして読みやすくするのに非常に便利です。ただし、エントリーレベルのプログラマーは、対処するのが少し難しいと感じるかもしれません。通過する必要のある3つの別個の概念があります。匿名メソッド、デリゲート、ラムダ式です。それらのそれぞれの詳細なウォークスルーは、この回答の範囲を超えています。以下に示すコード例が、利用可能なさまざまなアプローチをすばやく確認する目的に役立つことを願っています。
class TestBed
{
BackgroundWorker bgw = new BackgroundWorker();
void sample()
{
//approach #1
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
//DoWorkEventHandler is nothing but a readily available delegate written by smart Microsoft guys
//approach #2, to make it a little shorter
bgw.DoWork += (s,e) =>
{
//...
};
//this is called lambda expression (see the => symbol)
//approach #3, if lambda scares you
bgw.DoWork += delegate
{
//... (but you can't have parameters in this approach
};
//approach #4, have a helper method to prepare the background worker
prepareBgw((s,e)=>
{
//...
}
);
//approach #5, helper along with a simple delegate, but no params possible
prepareBgw(delegate
{
//...
}
);
//approach #6, helper along with passing the methodname as a delegate
prepareBgw(bgw_DoWork);
//approach #7, helper method applied on approach #1
prepareBgw(new DoWorkEventHandler(bgw_DoWork));
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
//...
}
void prepareBgw(DoWorkEventHandler doWork)
{
bgw.DoWork+= doWork;
}
}
この例では「委任」ではなく「委任」を使用していることに注意してください(2つの間に違いがあります)