我是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函数会在上一个函数完成之前执行。 如何修改代码,以便仅在计数完成后才显示弹出窗口? 谢谢。
答案 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();
}