C#form-控制在线程操作期间丢失停靠状态

C#form-控制在线程操作期间丢失停靠状态,c#,winforms,C#,Winforms,我有一个带有菜单条、状态条和主拆分容器(它本身包含其他拆分容器、树视图、选项卡控件等)的表单。偶尔(实际上相当频繁),应用程序会停止调整主窗体内控件的大小(通常是在后台线程检索数据的操作期间或之后)。控件本身仍然声称其DockStyle为Fill,但控件没有随窗体调整大小。我找不到任何可能导致此问题的信息,以前有人遇到过类似的情况吗?确保从正确的线程操作UI是至关重要的。我建议使用以下扩展方法 public delegate void EmptyHandler(); public delegat

我有一个带有菜单条、状态条和主拆分容器(它本身包含其他拆分容器、树视图、选项卡控件等)的表单。偶尔(实际上相当频繁),应用程序会停止调整主窗体内控件的大小(通常是在后台线程检索数据的操作期间或之后)。控件本身仍然声称其DockStyle为Fill,但控件没有随窗体调整大小。我找不到任何可能导致此问题的信息,以前有人遇到过类似的情况吗?

确保从正确的线程操作UI是至关重要的。我建议使用以下扩展方法

public delegate void EmptyHandler();
public delegate void ParamHandler(params object[] args);

public static void SafeCall(this Control control, 
                      ParamHandler method, params object[] args)
{
    if (control.InvokeRequired)
    {
        control.Invoke(method, args);
    }
    else
    {
        method(args);
    }
}
public static void SafeCall(this Control control, EmptyHandler method)
{
    if (control.InvokeRequired)
    {
        control.Invoke(method);
    }
    else
    {
        method();
    }
}
然后您可以像这样从错误的线程调用适当的方法

{  ... background thread 

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.SafeCall(SetImage, e.Result);
    }

 }
它使用正确的线程调用方法
SetImage(Bitmap-Bitmap)

嗯,这太愚蠢了


原来我有一个恶意的SuspendLayout()调用,但没有相应的ResumeLayout()调用。这种行为不是我所期望的。每天学习新的东西!谢谢你的关注

您的后台线程是否正在访问任何UI控件?你使用Invoke正确吗?以前从没听说过。我们需要重新编写代码。我正在测试UI控件上所需的InvokereRequired,所以这不应该是一个问题。我将尝试制作一个可复制的测试用例。