Подождите 5 секунд от запуска формы до перехода к другой форме - PullRequest
0 голосов
/ 05 августа 2020

Я хотел создать форму, которая отображала блок текста в течение 5 секунд на экране перед переключением на другую форму. Переключение кнопкой работает, а как через 5 секунд переключиться? Вот что у меня

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UltraPanel
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

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

        private void StartAsyncTimedWork()
        {
            myTimer.Interval = 5000;
            myTimer.Tick += new EventHandler(wait);
            myTimer.Start();
        }

        private void wait(object sender, EventArgs e)
        {
            this.Hide();
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }
    }
}

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете использовать событие Shown формы 2, сделать его async, а затем await вашим методом (здесь, восстановленным StartAsync(int interval)) оттуда, пропустив интервал задержки, который вы считаете нужным.

Form3 объявляется с помощью оператора using, поскольку используется .ShowDialog(): вам необходимо удалить эту форму. Я добавил this.Show(), чтобы снова отображать Form2, когда Form3 закрыт.

using System.Threading.Tasks;

private async void Form2_Shown(object sender, EventArgs e)
{
    await StartAsync(5000);
}

private async Task StartAsync(int interval)
{
    await Task.Delay(interval);
    this.Hide();
    using (var f3 = new Form3()) {
        f3.ShowDialog();
    }
    this.Show();
}

Несколько больше сделано, в случае, если Form2 можно закрыть, пока действует задержка: если вы не отмените Task.Delay(), Form3 будет отображаться, даже если Form2 (очевидно) уже закрыт:

private CancellationTokenSource cts = null;

private async void Form2_Shown(object sender, EventArgs e)
{
    cts = new CancellationTokenSource();
    try {
        await StartAsync(5000, cts.Token);
    }
    catch (TaskCanceledException) {
        // Do whatever you see fit here
        Console.WriteLine("Canceled");
    }
    finally {
        cts.Dispose();
        cts = null;
    }
}

private async Task StartAsync(int interval, CancellationToken token)
{
    await Task.Delay(interval, token);
    this.Hide();
    using (var f3 = new Form3()) {
        f3.ShowDialog();
    }
    this.Show();
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (cts != null) {
        cts.Cancel();
    }
}
...