Вы можете использовать событие 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();
}
}