14

次のコード行に進むまで、メソッドを 30 秒間一時停止する必要がある C# Windows Forms アプリケーションで作業しています。このアプリケーションに適していないものを試し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();
}
4

6 に答える 6

32

アプリが .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();
}
于 2012-12-06T09:45:09.300 に答える
13

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());
于 2012-12-06T09:43:48.867 に答える
6

クラスレベルで、のインスタンスを定義しますTimer(このようなクラスがいくつかあります-winformsアプリの場合は使用する必要がありますSystem.Windows.Forms.Timer

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

次に、メソッドに、ティックを処理して開始する行を追加します。

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();
}
于 2012-12-06T09:42:16.283 に答える
3

リアクティブ拡張機能を使用する方法もあります。

Observable.Return("Delayed").Delay(TimeSpan.FromSeconds(30)).Subscribe(val => Console.WriteLine("Executing delayed"));
于 2012-12-06T09:51:40.653 に答える