1

ロード画面ウィンドウを作成しようとしています。表示後に実行するコードがあるため、Show()代わりに使用します。ShowDialog()フォームを使用ShowDialog()する場合は問題ありませんが、Show()フォームを使用する場合は混乱します。これを引き起こしているのは何ですか?解決策は何ですか?これが私がそれをした方法です:

    bool closeLoadingWindow = false;
    void ShowLoadingWindow()
    {
        LoadingWindow loadingWindow = new LoadingWindow();
        loadingWindow.Show();
        while (!closeLoadingWindow);
        loadingWindow.Close();
        return;
    }
    public MainWindow()
    {
        Thread loadingWindowThread = new Thread(ShowLoadingWindow);
        loadingWindowThread.Start();
        InitializeComponent();
        // ...
        closeLoadingWindow = true;
    }

使用する場合ShowDialog()

画像1

Show()を使用する場合:

画像2

4

1 に答える 1

2

ループが実行されないために機能している理由ShowDialogwhile、ランタイムがコードのその行に到達すると、フォームが閉じられるまで処理を停止するためです。

コードに意味がありません。ここでスレッドを使用するポイントは、「ビジー」コード(whileループ)をメインUIスレッドから除外して、ブロックされないようにすることです。ただし、同じスレッドと非UIスレッドでフォームを作成/表示しようとしています。

ここで使用する必要はありません。使用ShowすることはできますShowDialogが、フォームを閉じるなどの点で少し注意が必要です。ただし、すぐに発生する問題を解決するには、次のことをお勧めします。

LoadingWindow _loadingWindow;

void ShowLoadingWindow()
{
    if (_loadingWindow == null)
        _loadingWindow = new LoadingWindow();
    _loadingWindow.Show();
}

void HideLoadingWindow()
{
    if (_loadingWindow != null)
    {
         _loadingWindow.Close();
         _loadingWindow.Dispose();
    }
}

void LoadSomething()
{
    while (...)
    {
        // busy code goes here
    }
    // after code is finished, close the form
    MethodInvoker closeForm = delegate { HideLoadingWindow(); };
    _loadingWindow.Invoke(closeForm);
}

public MainWindow()
{
    ShowLoadingWindow();
    new Thread(LoadSomething).Start();
}
}

参考までに-スレッドで実行しようとしていることの性質によっては、専用のスレッドを作成するよりも、タスク並列ライブラリを使用する方がよい場合があります。継続/キャンセルのサポートなどのさまざまな利点があります。

于 2013-03-27T14:03:28.960 に答える