在自己的线程中显示表单

时间:2016-03-24 14:38:27

标签: c# multithreading forms

我希望显示一些加载形式,而在主UI中执行一些耗时的操作。更具体的是,我导入了一个UI更改主题,需要一段时间(2-3秒)来执行它的更改。

但是,如果UI在加载时被阻止但是指示用户等待我没有问题,如果UI线程完成加载过程,我想要显示正在关闭的WaitForm

以下是我认为可行的方法:

static class WaitDialogManager
{
    private static bool _isVisible { get; set; } = false;

    private static Task _task;

    public static void ShowDialog()
    {
        if (!_isVisible)
        {
            _task = Task.Factory.StartNew(() =>
            {
                WaitDialog _dialog = new WaitDialog();

                _isVisible = true;
                _dialog.Show();

                do
                {
                    System.Threading.Thread.Sleep(10);
                } while (_isVisible);

                _dialog.Hide();
                _dialog.Dispose();
                _dialog = null;
            });
        }
    }

    public static void CloseDialog()
    {
        _isVisible = false;
    }
}

private void UpdateUI() 
{
    WaitDialogManager.ShowDialog();

    SetUpUI();

    WaitDialogManager.CloseDialog();
}

不幸的是,似乎不同的线程没有效果​​?!表格正在加载并显示,但所有的winforms都是白色矩形,没有显示进度条。

这是为什么?我怎样才能改变构造以使其有效?

提前致谢,ADP

1 个答案:

答案 0 :(得分:0)

如上所述,创建一个线程是一个愚蠢的想法! (感谢那些给予人们减去仅因为他们是初学者而且缺乏一些关于不同主题的知识的人 - 因为这对于初学者来说是正常的。感谢上帝,在某些地方有这样一个完美的人,他们从来不需要学习和了解所有事情。出生...)

但是,简单的刷新调用可确保表单可见。它正是我所需要的。