Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Form.Focus InvalidOperationException:跨线程操作无效_C#_Excel_Winforms_.net 4.5 - Fatal编程技术网

C# Form.Focus InvalidOperationException:跨线程操作无效

C# Form.Focus InvalidOperationException:跨线程操作无效,c#,excel,winforms,.net-4.5,C#,Excel,Winforms,.net 4.5,我在这里很清楚地检查了InvokeRequired,但是返回false,然后表单抛出invalidoOperationException。我做错了什么 /// <summary>Position the specified form within the specified bounds, /// and focus it, all in a thread-safe manner.</summary> private static void FocusForm_Helpe

我在这里很清楚地检查了
InvokeRequired
,但是返回false,然后表单抛出invalidoOperationException。我做错了什么

/// <summary>Position the specified form within the specified bounds,
/// and focus it, all in a thread-safe manner.</summary>
private static void FocusForm_Helper(Form form, double top, double height, double left, double width)
{
    if (form?.IsDisposed ?? true)
        return;
    if (form.InvokeRequired)
    {
        form.Invoke((Action)(() => FocusForm_Helper(form, top, height, left, width)));
        return;
    }
    form.Top = (int)(top + 0.5 * (height /*- form.Height*/));
    form.Left = (int)(left + 0.5 * (width /*- form.Width*/));
    form.Focus();
}

这种情况下的解决方案是
Focus()
方法不作用于窗体本身,而是作用于窗体显示的主控件。当窗体由于被
应用程序.Run
调用而具有自己的单元状态时,它的
调用所需的
不相关-它的主控件的状态是

因此,解决方案是:

if (form.Controls[0].InvokeRequired)
{
    form.Controls[0].BeginInvoke((Action)(() => ...));
    return;
}
form.Focus();

它抱怨出现了一个
数据上传对话框
,您是否在不同的线程上构造了一些控件?@LasseV.Karlsen表单是在主线程上创建的,但从具有自己单元状态的线程运行。我已经更新了问题来说明这一点。你为什么要递归到它自己?等等,你显然是在你的主线程上创建表单,然后在另一个线程上运行它。您也应该在该线程上创建表单。您在代码中添加了2个争用错误。IsDisposed检查没有意义,它不能保证表单在执行到达InvokeRequest时不会被释放。InvokeRequired不保证在执行到达Invoke()调用时不再需要它。这可能也会出错。在辅助线程上显示表单也是一个非常糟糕的主意,您必须熟悉这个场景。不要这样做。
if (form.Controls[0].InvokeRequired)
{
    form.Controls[0].BeginInvoke((Action)(() => ...));
    return;
}
form.Focus();