gpt4 book ai didi

c# - 线程类 'Splash-Type' 屏幕的 TPL 等效项

转载 作者:太空狗 更新时间:2023-10-29 21:45:32 25 4
gpt4 key购买 nike

给定下面的类,在备用线程上启动启动画面:

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。肯定有比在 SomeForm 类中创建 public static 方法更好的方法,例如

private static SomeForm _someForm;
public static void CloseSomeForm()
{
if (_someForm.InvokeRequired)
_someForm.Invoke(new MethodInvoker(CloseSomeForm));
}

我的问题是,使用任务并行库 (TPL) 执行与上面使用 SplashForm 类所示相同的事情的最佳方法是什么?具体来说,关闭调用的表单的最佳方法在 UI 的另一个线程上。

最佳答案

你的问题似乎不是关于 ThreadTask 之间的区别,因为你想要的是摆脱“脏”静态。我建议你把它封装成一个类:

class SplashController
{
public void Run() {
_someForm = new SomeForm();
someForm.ShowDialog();
}

private SomeForm _someForm;
public void CloseSomeForm()
{
if (_someForm.InvokeRequired)
_someForm.Invoke(new MethodInvoker(CloseSomeForm));
}
}

您可以使用您喜欢的任何线程机制调用 Run。 CloseSomeForm 不使用线程,因此它与此问题无关。

您现在可以在任何您喜欢的地方存储对 SplashController 实例的引用。在局部变量或实际上在静态变量中。后者是有道理的,因为只有一个启动画面。

因为静态状态现在被很好地封装了,所以我认为它被静态保存没有任何问题。

关于c# - 线程类 'Splash-Type' 屏幕的 TPL 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15298871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com