如何在x秒后触发方法运行?

时间:2012-12-06 09:33:59

标签: c# timer

我正在使用C#Windows窗体应用程序,我需要该方法暂停30秒,直到它继续到下一行代码。我尝试了Thread.Sleep()这不适合这个应用程序而且我已经明白我应该使用某种计时器代替。我已经搜索了很多,但我无法弄清楚如何实现计时器。

我的代码如下,任何人都可以告诉我应该如何实现计时器。我已经评论了我希望方法暂停的位置。

private void start_Vid_Click(object sender, EventArgs e)
{
    if (video.State != StateFlags.Running)
    {
        viewport.Visible = true;
        video.Play();
    }

    //Here I want to wait 30 seconds until the next line of code is triggered

    viewport.Visible = false;
    viewport2.Visible = true;
    pictureBox1.Visible = true;
    start_Webc(); 
    video2.Play();
}

6 个答案:

答案 0 :(得分:27)

如果您的应用是.Net 4.5应用,那么使用Task会更容易一些:

private async void start_Vid_Click(object sender, EventArgs e)
{
    if (video.State != StateFlags.Running)
    {
        viewport.Visible = true;
        video.Play();
    }

    await Task.Delay(TimeSpan.FromSeconds(30));

    viewport.Visible = false;
    viewport2.Visible = true;
    pictureBox1.Visible = true;
    start_Webc();
    video2.Play();
}

答案 1 :(得分:11)

在.NET 4.0上没有Task.Delay,但你可以启动任务,它只会睡30秒,之后你可以再次继续使用UI线程:

Task.Factory.StartNew(() => Thread.Sleep(30 * 1000))
            .ContinueWith((t) =>
    {
         viewport.Visible = false;
         viewport2.Visible = true;
         pictureBox1.Visible = true;
         start_Webc(); 
         video2.Play();
    }, TaskScheduler.FromCurrentSynchronizationContext());

答案 2 :(得分:4)

在课程级别定义Timer的实例(有这样的几个类 - 对于winforms应用,你应该使用System.Windows.Forms.Timer

static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();

然后在你的方法中添加行来处理它的tick并启动它:

private void start_Vid_Click(object sender, EventArgs e)
{
    if (video.State != StateFlags.Running)
    {
        viewport.Visible = true;
        video.Play();
    }

    myTimer.Tick += (o,ea) => {    
        viewport.Visible = false;
        viewport2.Visible = true;
        pictureBox1.Visible = true;
        start_Webc(); 
        video2.Play();
        myTimer.Stop();
    }
    myTimer.Interval = 5000; // 5 seconds
    myTimer.Start();
}

答案 3 :(得分:3)

还有一种反应性扩展方式:

Observable.Return("Delayed").Delay(TimeSpan.FromSeconds(30)).Subscribe(val => Console.WriteLine("Executing delayed"));

答案 4 :(得分:0)

我们可以使用

中的任务来做到这一点
System.Threading.Tasks.Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000);
            this.Invoke(new Action(() => 
                Method1()));
        });

答案 5 :(得分:0)

System.Threading.Tasks.Task.Delay( 60 * 1000 ).ContinueWith( (_) => StartVoid() );