![]() |
1
1
第一个版本的问题是,在“某些逻辑”中,您可能正在访问WPF对象——不能这样做,只能从创建它们的同一线程访问WPF对象。 第二个版本的问题是,您正在启动一个后台线程,该线程要求主线程完成所有工作,然后退出,所以您正在主线程(也完成所有UI工作)上完成所有工作,并且UI冻结,本质上这相当于根本不使用BackgroundWorker。 正如乔恩·斯基特所说,第三个版本是简单的错误用法,不应该像你想象的那样工作。 那么,你需要做什么? 在启动后台工作程序之前,需要从主线程的UI中收集所有信息,只能使用简单类型(string、int、double等)和线程安全类/结构,不能在后台工作程序执行的代码中使用任何WPF类。 收集完所有可以调用runworkerasync的数据后,在DoWork处理程序中,您不能从UI读取数据-只能访问以前准备的数据,也不能写入UI-必须将其保存到其他地方(例如类成员),并在BackgroundWorker完成后将其复制到UI。 “无法从另一个线程访问WPF”规则的唯一例外是Freezable(以及从Freezable继承的所有类),在调用Freeze方法之后,这使得对象为只读且线程安全。 |
![]() |
2
1
第二个版本不会做您想要的,因为参数的重载
第一个版本应该有效-但是根据Oded的评论,你没有给出任何你所说的“不工作”的迹象…您也没有指定两个版本都失败还是只有一个。 |
![]() |
3
0
另一件事要非常小心:如果你正在设置
一个简单的例子:
一般来说,我很少使用匿名方法。如果不是有意使用闭包,闭包会产生各种各样的问题。如果你是故意使用它们,那么很容易写下一些代码,这些代码太微妙了,根本无法修改一年。用显式参数编写一个命名方法可能需要更多的时间和代码,但这并不比用一个闭包来记录您正在做什么困难。
我不使用匿名方法
完全
与
|