一、子线程加载窗体绑定父窗体关键方法
1、ChildForm.Owner 设置子窗体的所有者
2、ParentForm.BeginInvoke 引用主窗口线程避免线程错误(不是从 xxxx 线程访问)
二、使用工具类
代码如下:
public class LoadingHelper
{
#region 相关变量定义
/// <summary>
/// 定义委托进行窗口关闭
/// </summary>
private delegate void CloseDelegate();
private static WaitForm1 loadingForm;
private static Form parentForm;
private static readonly Object syncLock = new Object(); //加锁使用
#endregion
/// 显示loading框
/// </summary>
public static void ShowLoadingScreen(Form form)
{
// Make sure it is only launched once.
if (loadingForm != null)
return;
parentForm = form;
Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowChildForm));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
/// <summary>
/// 显示窗口
/// </summary>
private static void ShowChildForm()
{
if (loadingForm != null)
{
loadingForm.Close();
loadingForm = null;
}
loadingForm = new WaitForm1();
loadingForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
loadingForm.Owner = parentForm;
parentForm.BeginInvoke(new Action(() => { loadingForm.ShowDialog(); }));
}
/// <summary>
/// 关闭窗口
/// </summary>
public static void CloseForm()
{
Thread.Sleep(100); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
if (loadingForm != null)
{
lock (syncLock)
{
Thread.Sleep(50);
if (loadingForm != null)
{
Thread.Sleep(50); //通过三次延时,确保可以彻底关闭窗口
loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
}
}
}
}