将BackgroundWorker转换为Task.使用Modal Display运行



我一直在学习TPL库中的功能。我看到了Stephen Cleary的一篇文章,它比较了BackgroundWorker和Task.Run。我对TPL很满意,并决定将一些BackgroundWorkers代码转换为Task.Run,在我的WinForm应用程序中运行,但我无法计算出特定情况下的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类:

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();
}

最新更新