我在这行代码上得到InvalidOperationException
:
SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05);
具体说明运行时错误......
跨线程操作无效:控制从其创建的线程以外的线程访问的“frmToaster”。
我使用了Stack Overflow上其他地方建议的SynchronizedInvoke
方法,以确保在需要时使用调用。
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required thread.
sync.Invoke(action, new object[] { });
}
即使我使用SynchronizeInvoke
来避免它,此代码如何生成有关跨线程调用的运行时错误?
答案 0 :(得分:2)
当sync.InvokeRequired为false时,你会得到它。这不好,应该是真的。在action()上设置断点;并了解休息时发生的事情。
这是在显示表单时使用的代码类型,当尚未创建表单的句柄时,InvokeRequired为false。确保此代码不会太快运行,您必须等到表单的OnHandleCreated()方法运行或Load事件触发,以更容易覆盖为准。
另一个简单的解决方法是不测试InvokeRequired,你知道它应该始终为true,因为你在工作线程上运行它。使用BeginInvoke,而不是Invoke,并且在UI线程重新进入消息循环之前,lambda将不会运行,在创建表单之后。最终修复,没有点燃烧线程只是为了淡化表格,使用winforms计时器。节省一兆字节。
答案 1 :(得分:-1)
我不认为lambda表达式是线程安全的