将一个System.Action分配给一个BackgroundWorker
问题描述:
我已经写了一小段代码来将Action
分配给BackGroundWorker
作为Delegate。
将一个System.Action分配给一个BackgroundWorker
public BackgroundWorker GetBackgroundWorker(System.Action doWork)
{
BackgroundWorker bwk= new BackgroundWorker();
bwk.DoWork += (sender, args) => { args.Result = doWork; };
return bwk;
}
BackgroundWorker wk = GetBackgroundWorker(MY_Delegate);
wk.RunWorkerAsync();
public void MY_Delegate()
{
//DO Stuff
}
为了使长话短说,我很奇怪,为什么在我火与RunWorkerAsync
呼叫的工人从来没有进入方法MY_Delegate
。
也许我的“=>”我的assignement语法很糟糕。
反正,我欢迎任何有效的方法来完成这项工作
答
public BackgroundWorker GetBackgroundWorker(System.Action doWork)
{
BackgroundWorker bwk= new BackgroundWorker();
bwk.DoWork += (sender, args) => { doWork(); };
return bw;
}
分配的doWork到args.Result不会调用DoWork的方法。
作为一个方面说明:方法和变量的命名表明您不完全理解委托,事件和lambda表达式。
谢谢!我一直在弄这个bug一个小时:-)这是一个奇特的语法,我不习惯它。我尝试修改一个基于模板的代码:'args.Result =(K)doWork((T)args.Argument);'实际上'args.Result = doWork();'可以工作,但在这种情况下,一个void委托,所以这里没有用处。再次感谢 ! – 2011-12-29 10:35:02
关于旁注,如果我真的明白了,我不会问(愚蠢的)问题:-P更严重:这不是我的“真实”代码,我只是试着写一个最小样本来重现我所面临的问题。我试图从一个漂亮的博客条目中为代码添加一个“void”委托功能:http://pooyakhamooshi.blogspot.com/2009/11/create-thread-safe-queued.html – 2011-12-29 15:56:21