この問題がスレッド (BackgroundWorker
およびその他) を介してどのように直面するか、および UI の応答性を維持する方法について学んでいます。私はそうすることができましたが、それは私が望んでいるものではないことに気付きました。実際に必要なのはProgressBar
、長い操作が実行されている間にアニメーションを表示することだけです。(その操作ではすべてのグラフィック表現をエクスポートしており、プロッターは常に更新されているため、UI を更新する必要はありません/更新したくありません)。
操作の実行中に進行状況バーを含むダイアログがポップアップすることを考えました。問題は、次の例外が発生することです。
The calling thread cannot access this object because a different thread owns it
これについては多くの質問があり、答えは を使用することDispatcher
です:
Dispatcher.CurrentDispatcher.Invoke(() => myOperation(), DispatcherPriority.Normal);
行ったことは次のとおりです。
私はModern UIを使用しています.ModernDialogと呼ばれるダイアログがあります.これは単なる派手なダイアログです.
class DialogProgress
{
public ModernDialog progressDlg = new ModernDialog();
public DialogProgress()
{
ProgressBar bar = new ProgressBar();
bar.IsIndeterminate = true;
bar.Width = 150;
StackPanel content = new StackPanel();
content.Children.Add(bar);
progresoDlg.Content = content ;
//Thread paralel = new Thread(() => myOperation());
//paralel.SetApartmentState(ApartmentState.STA);
//paralel.Start();
Dispatcher.CurrentDispatcher.Invoke(() => myOperation(), DispatcherPriority.Normal);
}
void myOperation()
{
progresoDlg.ShowDialog();
}
}
スレッドとディスパッチャーがありますが、それらの使用方法がわかりません。
このダイアログを呼び出す方法は次のとおりです。
public void MyLongMethod()
{
DialogProgress progress = new DialogProgress();
}
Dispatcher のみを使用すると、ダイアログが表示され、バーがアニメーション化されますが、MyLongMethod は機能しません (ダイアログを閉じた後に開始されます)。
スレッドを使用すると、前述の例外が発生します。
どうすればこの問題を解決できますか?
(ダイアログを使用するPDは単なる提案です。プログレスバーがUIにあり、長いメソッドの開始/終了時に可視性を切り替えると、私も嬉しいです)