我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
Kam*_*eri 30
如果您的应用是.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();
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*kiy 12
Task.Delay在.NET 4.0上不可用,但您可以启动任务,它将只睡眠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());
Run Code Online (Sandbox Code Playgroud)
System.Threading.Tasks.Task.Delay( 60 * 1000 ).ContinueWith( (_) => StartVoid() );
Run Code Online (Sandbox Code Playgroud)
在类级别定义一个实例Timer(有一些这样的类 - 对于 winforms 应用程序,您应该使用System.Windows.Forms.Timer)
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
Run Code Online (Sandbox Code Playgroud)
然后在您的方法中添加行来处理其刻度并启动它:
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();
}
Run Code Online (Sandbox Code Playgroud)