在c#开始之前延迟做一些代码

时间:2014-09-22 10:25:22

标签: c#

我正在创建一些生成一些文字的应用程序,但是当我点击我的按钮时,它会花费大约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;
}

那我怎么能这样做呢?

6 个答案:

答案 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)

Thread.Sleep(5000);

Thread.Sleep()会暂停您的代码。 时间以毫秒或时间跨度指定。

但要注意,代码将完全停在那里,并等到给定的时间结束。

答案 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...
        }
    }