1

Visual Studio 2012 で C# で Windows フォームをコーディングしています。MessageBox の複数のインスタンスを開き、数秒後に自動的に閉じたいと思います。

ここでこの回答を見つけました(そして賛成しました)SO: Close a MessageBox after few seconds

ただし、これは関数を使用するため、一度に 1 つの MessageBox しか開いていない場合に機能FindWindowし、MessageBox の複数のインスタンスはすべて同じウィンドウ タイトル (キャプション) を持つ必要があります。

[オプション]さらに、このダイアログは 5 秒で閉じます、この [...] は 4 秒で、この [...] は 3 秒で、...、などのカウントダウンをユーザーに提示したいと思います。この [...] 1 秒で、最後に MessageBox を閉じます。

複数の MessageBoxes を一意に参照し、一定時間 (5 秒など) 後に自動的に閉じる方法はありますSystem.Timers.Timerか?System.Threading.TimerSystem.Windows.Forms.Timer

4

3 に答える 3

1

次のコードは、開始点として使用できます。これは、私が最近行った関連する回答に基づいています。

async void MainForm_Load(object sender, EventArgs e)
{
    Func<Func<Form>, Task<Form>> showAsync = (createForm) =>
    {
        var tcs = new TaskCompletionSource<Form>();
        var form = createForm();
        form.Tag = Task.Factory.StartNew(
            () => form.ShowDialog(), 
            CancellationToken.None, 
            TaskCreationOptions.None,
            TaskScheduler.FromCurrentSynchronizationContext());
        form.Load += (sIgnore, eIgnore) =>
            tcs.TrySetResult(form);
        return tcs.Task;
    };

    var forms = new Stack<Form>();
    for (var i = 0; i < 4; i++)
        forms.Push(await showAsync((() =>
            new Form { Text = "Hello #" + i })));

    var closeFormTasks = forms.Select((form) => (Task)form.Tag);

    var delay = Task.Delay(5000);
    var task = await Task.WhenAny(delay, Task.WhenAll(closeFormTasks));

    if (task == delay)
    {
        while (forms.Any())
        {
            var form = forms.Pop();
            form.Close();
            await (Task)form.Tag;
        }
    }

    MessageBox.Show("All closed.");
}
于 2014-02-04T16:35:40.373 に答える