c# - 将BackgroundWorker转换为具有模态显示的Task.Run

标签 c# winforms modal-dialog task-parallel-library backgroundworker

我一直在了解 TPL 库中的功能。我遇到了article来自 Stephen Cleary,它比较了 BackgroundWorker 和 Task.Run。我对 TPL 相当满意,并决定在我的 WinForm 应用程序中将一些 BackgroundWorker 代码转换为 Task.Run,​​但我无法找出特定情况下的 Task.Run 等效项。本质上,我在后台工作器中运行长时间运行的操作时显示模式表单,目的是禁止用户执行任何操作,同时确保应用程序不会挂起。完成后,模态表单将以编程方式关闭。我使用 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();
}

关于c# - 将BackgroundWorker转换为具有模态显示的Task.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37197014/

相关文章:

javascript - 从后面的代码关闭 SP.UI.ModalDialog PopUp

asp.net-mvc - ASP.NET MVC 3 Jquery 模态弹出窗口 - 显示加载图标

c# - 将 JSON 字符串解析为 .NET 对象

C# JSON 解析问题

c# - Visual Studio 单元测试 C# 的命令行参数

winforms - Winform 的鱼眼

VS 代码中的 C# 控制台应用程序未在 Application Insight 中编写

c# - 如何将多个甘特图条放在同一行?

c# - 如何在任务栏中的图标上添加点击事件?

twitter-bootstrap - 当将值作为参数传递给 addin 时将值传递给 ember.js 组件(例如 ember-bootstrap-modals-manager)