C# 尽管使用了invoke,但关于跨线程调用的运行时错误
我在这一行代码中得到一个C# 尽管使用了invoke,但关于跨线程调用的运行时错误,c#,multithreading,C#,Multithreading,我在这一行代码中得到一个invalidoOperationException: SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05); 要具体说明运行时错误 跨线程操作无效:从创建控件“frmToaster”的线程以外的线程访问控件“frmToaster” 我使用了堆栈溢出中其他地方建议的SynchronizedInvoke方法,以确保在需要时使用调用 static void SynchronizedInvo
invalidoOperationException
:
SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05);
要具体说明运行时错误
跨线程操作无效:从创建控件“frmToaster”的线程以外的线程访问控件“frmToaster”
我使用了堆栈溢出中其他地方建议的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
来避免跨线程调用,该代码如何生成运行时错误?我不认为lambda表达式是线程安全的当sync.InvokeRequired为false时,您会得到该错误。那不好,应该是真的。在action()上设置断点;当你休息的时候,看看发生了什么
这是在显示表单时使用的代码类型,在尚未创建表单句柄时,InvokeRequired为false。确保这段代码不会运行得太快,您必须等待表单的OnHandleCreated()方法运行或Load事件触发,以较容易重写的为准
另一个简单的修复方法是不测试invokererequired,因为您在工作线程上运行它,所以您知道它应该总是正确的。使用BeginInvoke,而不是Invoke,在创建表单后UI线程重新进入消息循环之前,lambda不会运行。最终的解决方案是,使用winforms定时器,烧掉一个线程来淡出一个窗体是毫无意义的。为您节省一兆字节