使用模态显示将 BackgroundWorker 转换为 Task.Run

Converting BackgroundWorker to Task.Run with a Modal Display

我一直在了解 TPL 库中的功能。我遇到了来自 Stephen Cleary 的 article,它比较了 BackgroundWorker 和 Task.Run。我对 TPL 相当满意,并决定在我的 WinForm 应用程序中将一些 BackgroundWorker 代码转换为 Task.Run,但我无法计算出特定情况下的 Task.Run 等价物。本质上,我在 BackgroundWorker 中显示模式形式,而长 运行 操作是 运行,目的是禁止用户执行任何操作,同时确保应用程序不会挂起。完成后,模态窗体以编程方式关闭。我使用 BgWorker 快速创建了一个示例。这是主要形式:

public partial class Form1 : Form
{
        FrmMessageBox frm_ = new FrmMessageBox();
        BackgroundWorker worker_ = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();
            worker_.DoWork += (_, __) =>
            {
                Thread.Sleep(10000);
            };

            worker_.RunWorkerCompleted += (_, __) =>
            {
                    frm_.Close();
            };
        }

        private void button1_Click(object sender, EventArgs e)
        {
            worker_.RunWorkerAsync();
            ShowMessageBox();
        }

        private void ShowMessageBox()
        {
            frm_.Show("We're delaying 10 secs!", "Delay");
        }

        private void CloseMessageBox()
        {
            frm_.Close();
        }
    }

这是 FrmMessageBox class:

public partial class FrmMessageBox : Form
    {
        public FrmMessageBox()
        {
            InitializeComponent();

        }

        public DialogResult Show(string message, string title)
        {
            Text = title;
            label1.Text = message;
            return ShowDialog();
        }
    }

当我单击主窗体上的按钮时,BgWorker 启动并显示模态窗体。 BgWorker 完成后,表单将在完成事件中关闭。有没有办法用 Task.Run 获得同样的行为?

试试这个代码

private void button1_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        Thread.Sleep(2000);
        Invoke(new Action((CloseMessageBox));
    });

    ShowMessageBox();
}