最佳答案
根据 MSDN即使在 InvokeRequired
应该是 true
的情况下,InvokeRequired
也可以返回 false
- 即在您访问 的情况下>InvokeRequired
在创建该控件/窗体(或其父级)的 Handle
之前。
基本上您的检查不完整导致您看到的结果。
你需要检查IsHandleCreated
- 如果为 false
,则无论 InvokeRequired
返回什么,您都需要使用 Invoke
/BeginInvoke
。
[更新]
但是:
这通常不会很好地工作,因为 Invoke
/BeginInvoke
检查哪个线程创建了 Handle
来发挥他们的魔力......
[/更新]
只有当 IsHandleCreated
为 true
时,您才会根据 InvokeRequired
返回的内容采取行动 - 类似于:
if (control.IsHandleCreated)
{
if (control.InvokeRequired)
{
control.BeginInvoke(action);
}
else
{
action.Invoke();
}
}
else
{
// in this case InvokeRequired might lie - you need to make sure that this never happens!
throw new Exception ( "Somehow Handle has not yet been created on the UI thread!" );
}
[更新]
因此,以下内容对于避免此问题很重要
始终确保在 UI 线程以外的线程上首次访问之前已经创建了 Handle
。
根据 MSDN您只需要在 UI 线程中引用 control.Handle
以强制创建它 - 在您的代码中,这必须在您第一次从非 UI 的任何线程访问该控件/表单之前发生线程。
[/更新]
关于c# - 我的 InvokeRequied #2 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946590/