后台工作人员在任务完成之前执行的功能

时间:2018-11-27 20:10:34

标签: c# winforms

我是Visual Studio 2017中Windows窗体的新手。 我正在尝试创建一个简单的应用程序,单击该按钮时该应用程序从1到100开始计数,然后在完成该过程后创建一个弹出窗口。我的按钮点击功能如下所示:

private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        worker1.RunWorkerAsync(value);
        Open_Prompt(); //pop-up window
    }

但是,我意识到Open_prompt函数会在上一个函数完成之前执行。 如何修改代码,以便仅在计数完成后才显示弹出窗口? 谢谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用异步方法

using System.Threading.Tasks;

private async void button1_Click(object sender, EventArgs e)
{
     button1.Enabled = false;
     await DoWorkAsync(e);
     MessageBox.Show("Done!");
     button1.Enabled = true;
}

private async Task DoWorkAsync(object value)
{
    await Task.Run(() =>
    {
       //Some work
    });
}

不过,您可以通过以下背景工作人员进行此操作:

using System.ComponentModel;

private BackgroundWorker _worker;

    public Form1()
    {
        InitializeComponent();
        _worker = new BackgroundWorker();
        _worker.DoWork += (sender, args) =>
        {
            //i do something
        };
        _worker.RunWorkerCompleted += (sender, args) =>
        {
            MessageBox.Show("Done!");
            button1.Enabled = true;
        };

    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        _worker.RunWorkerAsync(e);
    }

答案 1 :(得分:0)

我将使用on完成的事件处理程序。它将等到呼叫者完成。

 private void button1_Click(object sender, EventArgs e)
        {
            worker1.RunWorkerCompleted += eventHandler;
            worker1.RunWorkerAsync(1);


        }

        private void eventHandler(object sender, RunWorkerCompletedEventArgs e)
        {
            MethodInvoker methodInvokerDelegate = delegate ()
            {
                Open_Prompt();
            };

            if (this.InvokeRequired)
                this.Invoke(methodInvokerDelegate);
            else
                methodInvokerDelegate();
        }
相关问题