0

この問題がスレッド (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にあり、長いメソッドの開始/終了時に可視性を切り替えると、私も嬉しいです)

4

2 に答える 2

-1

ModernDialogが WPFであると仮定するとWindowShowDialogメソッドは閉じられるまで戻りません。Invokeも、操作が呼び出されて戻るまで戻りません。の代わりにShowを使用するか、 の代わりにBeginInvokeShowDialogを使用して呼び出す必要があります。ダイアログボタンをクリックしてユーザーが応答するのを待っていない限り、実際には意味がないため、 を使用します。InvokeShowShowDialog

于 2013-08-31T12:43:26.567 に答える