等待对话框,当 GUI 需要一段时间时

本文关键字:一段时间 GUI 对话框 等待 | 更新日期: 2023-09-27 17:55:44

我有一个应用程序可能需要很长时间才能执行一些 GUI 更新。我无法在后台线程中运行它,因为长时间的处理与更新只能在主线程中完成的 GUI 组件相关联。

因此,我创建了一个帮助程序类,该类将在后台线程中创建和显示 WaitDialog 窗体,直到 GUI 完成更新。

我的帮助程序类如下所示:

public class ProgressWaitDialogHelper : IDisposable
{
    private Thread _thread = null;
    public void ShowDialog()
    {
        ThreadStart threadStart = new ThreadStart(ShowDialogAsync);
        _thread = new Thread(threadStart);
        _thread.SetApartmentState(ApartmentState.STA);
        _thread.Start();
    }
    public void Dispose()
    {
        if ((_thread != null) &&
            (_thread.IsAlive))
        {
            _thread.Abort();
        }
    }
    private void ShowDialogAsync()
    {
        ProgressWaitDialog waitDialog = new ProgressWaitDialog();
        waitDialog.ShowDialog();
    }
}

在我的主 GUI 窗口中调用帮助程序类的代码如下所示:

using (ProgressWaitDialogHelper waitDialog = new ProgressWaitDialogHelper())
{
    waitDialog.ShowDialog();
    // Do long running GUI task on main thread here.
}

这似乎工作正常,看起来与我在 GUI 上想要的完全一样。WaitDialog 表单是模式表单,在完成更新之前阻止对主 GUI 表单的访问。一旦长时间运行的 GUI 任务完成,它将退出 Using 块,从而在帮助程序类上调用 Dispose 方法,而帮助程序类又会在线程上调用 Abort。

我的问题是,是否有一种更优雅的方式来终止线程或更好的方法来实现相同的行为?

等待对话框,当 GUI 需要一段时间时

我建议在工作线程上做实际工作,并在 GUI 线程上显示等待对话框。 然后,您可以在工作完成时向主线程发出信号,并且在工作完成后,线程可以正常方式优雅地终止,您可以像杀死任何其他对话框一样终止等待对话框。