将lambda表达式/匿名方法传递给BackgroundWorker

时间:2016-10-26 10:36:42

标签: c# lambda backgroundworker

假设我的代码中有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

错误:

  

无法将匿名方法转换为&#39; object&#39;因为它不是   委托类型

或者

  

无法将lambda表达式转换为&#39; object&#39;因为它不是   委托类型

那么如何将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;
}

1 个答案:

答案 0 :(得分:2)

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