将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表达式/匿名方法传入BackgroundWorker

您需要将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");
}