Ответ 1
Вам просто нужно добавить параметры анонимной функции:
bgw.DoWork += (sender, e) => { ... }
Или, если вам не нужны параметры, которые вы можете просто:
bgw.DoWork += delegate { ... }
Я создам BackgroundWorker с анонимным методом.
Я написал следующий код:
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(
() =>
{
int i = 0;
foreach (var item in query2)
{
....
....
}
}
);
Но Делегат "System.ComponentModel.DoWorkEventHandler" не принимает аргументы "0" , и я должен передать два объекта анонимному методу: отправитель объекта, DoWorkEventArgs e
Не могли бы вы направить меня, как я могу это сделать? Спасибо.
Вам просто нужно добавить параметры анонимной функции:
bgw.DoWork += (sender, e) => { ... }
Или, если вам не нужны параметры, которые вы можете просто:
bgw.DoWork += delegate { ... }
Если вы укажете лямбда, вы должны убедиться, что оно принимает одинаковое количество аргументов:
bgw.DoWork += (s, e) => ...;
Но если вы не используете аргументы, вы можете просто использовать анонимный делегат без параметров:
bgw.DoWork += delegate
{
...
};
Если вы написали выше без lambdas, как это будет?
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);
}
Но теперь вы используете lambdas без связанных переменных() = > Вы должны указать двух отправителей объектов и e (которые впоследствии будут получать тип, указанный ниже).
backgroundWorker1.DoWork += (sender, e) => ...
Лямбда-выражения действительно удобны, чтобы сделать код короче и читабельнее. Однако программистам начального уровня может быть сложно справиться. Есть три отдельных понятия, которые нужно пройти: анонимные методы, делегаты и лямбда-выражения. Подробное прохождение каждого из них выходит за рамки этого ответа. Я надеюсь, что приведенный ниже пример кода послужит целью дать быстрый обзор различных доступных подходов.
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;
}
}
Обратите внимание, что мы использовали "делегат", а не "делегировать" в этом примере (существует разница между ними)