2

2 番目の UI スレッドでウィンドウを起動し、自由にシャットダウンできるようにする必要があります。

これは私の現在のコードです:

/// <summary>Show or hide the simulation status window on its own thread.</summary>
private void toggleSimulationStatusWindow(bool show)
{
    if (show)
    {
        if (statusMonitorThread != null) return;
        statusMonitorThread = new System.Threading.Thread(delegate()
        {
            Application.Run(new AnalysisStatusWindow(ExcelApi.analyisStatusMonitor));
        });
        statusMonitorThread.Start();
    }
    else
    {
        if (statusMonitorThread != null) 
            statusMonitorThread.Abort();
        statusMonitorThread = null;
    }
}

AnalysisStatusWindowかなり基本的なSystem.Windows.Forms.Form

上記のコードは新しい UI スレッドを正常に作成してAbortいますが、スレッドへの要求は無視されます。その結果、上記の関数を複数回切り替えると、新しいウィンドウが開くだけです。これらはすべて独自のスレッド上にあり、完全に機能します。

このスレッドにメッセージを渡して適切にシャットダウンする方法はありますか? Abort()それに失敗した場合、2 番目の UI スレッドを確実に強制終了する方法はありますか?


の代わりにnew Form().Show()andを使用してみましたが、シャットダウンするのは簡単ではありません。.ShowDialog()Application.Run(new Form())

別の UI スレッドの必要性を疑問視する人がいる場合、このコードは Excel アドインに存在し、特定のセルの計算中に Excel UI がブロックされるという事実を制御できません。そのため、実行時間の長いカスタム フォーミュラが実行されるときは、この 2 番目の UI スレッドで進行状況の更新を表示する必要があります。

4

1 に答える 1

2

Hans さん、コメントありがとうございます。次のコードを使用して問題を解決しました。

/// <summary>Show or hide the simulation status window on its own thread.</summary>
private void toggleSimulationStatusWindow(bool show)
{
    if (show)
    {
        if (statusMonitorThread != null) return;
        statusMonitorWindow = new AnalysisStatusWindow(ExcelApi.analyisStatusMonitor);
        statusMonitorThread = new System.Threading.Thread(delegate()
        {
            Application.Run(statusMonitorWindow);
        });
        statusMonitorThread.Start();
    }
    else if (statusMonitorThread != null)
    {
        statusMonitorWindow.BeginInvoke((MethodInvoker)delegate { statusMonitorWindow.Close(); });
        statusMonitorThread.Join();
        statusMonitorThread = null;
        statusMonitorWindow = null;
    }
}
于 2013-11-05T22:41:55.533 に答える