给定下面的类,在备用线程上启动启动屏幕:
public partial class SplashForm : Form
{
private static Thread _splashThread;
private static SplashForm _splashForm;
public SplashForm()
{
InitializeComponent();
}
// Show the Splash Screen (Loading...)
public static void ShowSplash()
{
if (_splashThread == null)
{
// Show the form in a new thread.
_splashThread = new Thread(new ThreadStart(DoShowSplash));
_splashThread.IsBackground = true;
_splashThread.Start();
}
}
// Called by the thread.
private static void DoShowSplash()
{
if (_splashForm == null)
_splashForm = new SplashForm();
// Create a new message pump on this thread (started from ShowSplash).
Application.Run(_splashForm);
}
// Close the splash (Loading...) screen.
public static void CloseSplash()
{
// Need to call on the thread that launched this splash.
if (_splashForm.InvokeRequired)
_splashForm.Invoke(new MethodInvoker(CloseSplash));
else
Application.ExitThread();
}
}
使用以下相应命令调用并关闭它
SplashForm.ShowSplash();
SplashForm.CloseSplash();
美好的。
我对 TPL 并不陌生,当然我们可以使用以下简单的方法在另一个线程上显示表单:
Task task = Task.Factory.StartNew(() =>
{
SomeForm someForm = new SomeForm();
someForm.ShowDialog();
};
我的问题是SomeForm
当你准备好时关闭它。必须有比public static
在SomeForm
类中创建方法更好的方法
private static SomeForm _someForm;
public static void CloseSomeForm()
{
if (_someForm.InvokeRequired)
_someForm.Invoke(new MethodInvoker(CloseSomeForm));
}
我的问题是,使用上面使用任务并行库 (TPL) 的 SplashForm 类执行相同操作的最佳方法是什么?具体来说,关闭 UI 中另一个线程上调用的表单的最佳方式。