我正在创建一些生成一些文字的应用程序,但是当我点击我的按钮时,它会花费大约1或2秒后显示一些消息框,但我想将其增加到5或6秒。点击按钮时,这是我的代码:
private void button1_Click(object sender, EventArgs e)
{
progressBar1.MarqueeAnimationSpeed = 50;
//my code
// delay here for 5 or 6 sec
MessageBox.Show(id);
pictureBox1.Visible = true;
}
那我怎么能这样做呢?
答案 0 :(得分:8)
使用async/await
功能等待异步,以便您的UI线程在您等待时响应:
private async void button1_Click(object sender, EventArgs e)
{
progressBar1.MarqueeAnimationSpeed = 50;
await Task.Delay(5000);
MessageBox.Show(id);
pictureBox1.Visible = true;
}
答案 1 :(得分:1)
一个简单的解决方案是创建一个具有所需间隔的一次性计时器。当计时器触发时,显示您的消息框。
您不想做的是从您的GUI线程调用Sleep
,因为这会阻止GUI。
答案 2 :(得分:1)
只有Thread.Sleep
无法帮助您,因为它会阻止用户界面并且进度条无法更新。使用Task.Run
:
progressBar1.MarqueeAnimationSpeed = 50;
Task.Run(() =>
{
// your long running code
})
.ContinueWith( () =>
{
this.Invoke((Action)delegate()
{
MessageBox.Show(id);
pictureBox1.Visible = true;
});
});
答案 3 :(得分:0)
答案 4 :(得分:0)
Thread.Sleep(5000)
会暂停你的代码5秒钟...... sleep方法的参数以毫秒为单位。 但是你为什么要让Messagebox等到它出现? Thread.Sleep大多数时候被认为是代码气味......
编辑:这将阻止UI-Thread。如果用户界面必须保持响应,请使用Selman22的解决方案
答案 5 :(得分:0)
Selman22的解决方案很好,另一种使用建议的Thread.Sleep();
而不冻结GUI的方法是使用后台工作程序及其进度更改事件。
您可以执行类似于100次迭代的循环,在每次迭代中执行一次小Thread.Sleep();
,并且在每次迭代后发送更改进度并更新进度条。
后台工作人员看起来像这样:
private void BackgroundWorkerStartEvent(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void BackgroundWorkerCancelBeforeWorkIsDoneEvent(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation)
{
backgroundWorker1.CancelAsync();
}
}
private void DoWorkEvent(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
const int loopnumber = 100;
for (int i = 1; i <= loopnumber; i++)
{
if (worker != null && worker.CancellationPending)
{
e.Cancel = true;
break;
}
System.Threading.Thread.Sleep(100);
if (worker != null) worker.ReportProgress(i * 100/loopnumber);
}
}
private void ProgressChangedEvent(object sender, ProgressChangedEventArgs e)
{
//...update your progress bar or something.
}
private void RunWorkerCompletedEvent(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
//...Do what you do if the backgroundworker go cancelled...
}
else if (e.Error != null)
{
//...Error displaying...
}
else
{
//...Do what you do if it worked fine...
}
}