【问题标题】:Pass lambda expression/anonymous method into BackgroundWorker将 lambda 表达式/匿名方法传递给 BackgroundWorker
【发布时间】:2016-10-26 10:36:41
【问题描述】:

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

错误:

无法将匿名方法转换为类型“对象”,因为它不是 委托类型

或者

无法将 lambda 表达式转换为类型“对象”,因为它不是 委托类型

那么我怎样才能将 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;
}

【问题讨论】:

  • 您的代码有一个 Func&lt;string&gt; f 类型,您使用字符串调用它。这不会编译,因为f 是一个不接受任何内容并返回字符串的函数。你需要Action&lt;string&gt; f
  • 将其赋值给一个变量并作为参数传递Action&lt;string&gt; obj = Console.WriteLine; bw.RunWorkerAsync(obj);是的,你需要Action&lt;string&gt;而不是Func&lt;string&gt;

标签: c# lambda backgroundworker


【解决方案1】:

你需要将 lambda 赋值给一个变量,然后传入:

Action<string> action = (string txt) => Console.WriteLine(txt);
bw.RunWorkerAsync(action);

请注意,我使用了Action&lt;&gt;,因为您的代码获取数据并且不返回任何内容。你的DoWork 处理程序是错误的,应该是这样的:

bw.DoWork += (object sender, DoWorkEventArgs e) => {
    Action<string> f = (Action<string>)e.Argument;
    f("step one");
    ...
    f("step two");
}

【讨论】:

  • 谢谢,@Sean 这正是我所需要的。是的,我写了Func&lt;string&gt; 只是为了描述我的目标。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2016-10-11
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多