我的系统在一个工作线程上发生了一些事情。假设状态发生了变化。我想在UI线程中处理新的状态,所以我分派了一个委托在那里调用:
var state = GetState();
Dispatcher.BeginInvoke(() => StateChanged(state));当StateChanged在UI线程上执行时,我能确保参数state的值是GetState() 在调度之前返回的值吗?还是会对临时state变量进行优化,以便在UI线程上调用GetState()来填充StateChanged参数?
发布于 2012-02-14 00:37:46
然后,我可以确定参数状态的值是由
()在调度之前返回的值,或者临时状态变量将被优化>清除
没有state不会被优化掉。然而,在之前实际上是这个问题的棘手部分。只要您不改变状态变量后的(在同一范围内),您就没有什么可担心的了。
{
// say GetState returns 2
var state = GetState();
// state now = 2
Dispatcher.BeginInvoke(() => StateChanged(state));
state = 3;
}在上面的代码中,state不会被优化掉。但是,这并不意味着将以值2调用StateChanged。如果工作线程在启动dispatcher线程之前完成执行,那么它可以是3。
这里的要点是,变量捕获确保值被保留下来供闭包使用,但这并不意味着该值是不可变的。
发布于 2012-02-13 23:51:23
不,肯定会在工作线程上调用GetState。在lambda表达式中移动GetState()调用的“优化”将完全无效。
发布于 2012-02-13 23:57:15
这不会发生,因为它将改变操作的语义,因此不允许进行优化;您可以通过调用方法对变量进行赋值,因此由于C#不是一种懒惰的语言,因此必须在此时进行。
https://stackoverflow.com/questions/9269804
复制相似问题