0

ac# wpf アプリケーションで、オープン ソースのグラフ作成ライブラリ oxyplot を使用しています。グラフ キャンバス オブジェクトの更新時に UI スレッドがブロックされるという問題が発生しています。キャンバス オブジェクトが UI スレッドに属しているため、更新は UI スレッドで行われます。

バックグラウンド スレッドで実行できるすべてのコードを既に移動しましたが、キャンバスの実際の描画は簡単には解決できません。

ライブラリの作成者は、UI スレッドの同期コンテキストからスケジューラを使用してこのコードを試しましたが、キャンバスへの書き込み時に UI スレッドのブロックを回避できませんでした。

上記の例は、プロット ライブラリとほとんど同じように機能するため、ここではコードを示しません。

UIスレッドをブロックせずにこれを実装するにはどうすればよいですか?

編集:

これが私のコードのスニペットです-これを実装しようとした方法を示しています。コードの最初の部分でパス データを作成していることがわかります。終了したら、UI スレッドでこれらをループしてキャンバスに追加しようとします。ただし、 Add(p) 呼び出しに渡されると、オブジェクトが別のスレッドに属しているというエラーが表示されます。

        .........
            pa.Add(path);
        }

        Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                addToCanvas(pa.ToList());
            }));
    }

    public void addToCanvas(List<Path> path)
    {
        foreach (Path p in path)
        {
            Add(p);
        }
    }
4

1 に答える 1

1

ここでは、ダブル バッファリングのようなちょっとしたハックを使用する必要があると思います。バッファ (バイト、ビットマップなど) を作成し、別のスレッドで描画してから、描画したものをコントロールに配置します。

于 2013-11-12T09:55:24.747 に答える