将lambda表达式/匿名方法传入BackgroundWorker
本文关键字:方法 BackgroundWorker lambda 表达式 | 更新日期: 2023-09-27 18:15:03
假设我的代码中有一个BackgroundWorker
。我想在开始时传递匿名函数/委托。下面的代码是我想要做的:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (object sender, DoWorkEventArgs e) => {
Func<string> f = (Func<string>)e.Argument;
f("step one");
...
f("step two");
}
bw.RunWorkerAsync((string txt) => {Console.WriteLine(txt);} ); // doesn't work
// bw.RunWorkerAsync( delegate(string txt) { Console.WriteLine(txt); })); // doesn't work too
错误:
不能将匿名方法转换为'object'类型,因为它不是委托类型
或
不能将lambda表达式转换为'object'类型,因为它不是委托类型
那么我如何将lambda表达式/匿名方法传入BackgroundWorker
?
下面是一段C代码来描述我所需要的东西:
void func(char *ch)
{
printf("%s", ch);
}
void test( void (* f)(char *) )
{
f("blabla");
}
int main(int argc, char *argv[])
{
test(func);
return 0;
}
您需要将lambda赋值给一个变量,然后传入:
Action<string> action = (string txt) => Console.WriteLine(txt);
bw.RunWorkerAsync(action);
请注意,我已经使用了Action<>
作为你的代码获取数据,不返回任何东西。您的DoWork
处理程序是错误的,应该是这样的:
bw.DoWork += (object sender, DoWorkEventArgs e) => {
Action<string> f = (Action<string>)e.Argument;
f("step one");
...
f("step two");
}