0

IlegalOperationExceptionパラメータが別のスレッドを所有しているため、次のコードを取得しています。この例外が発生する理由はわかっていますが、この問題を解決する方法がわかりません。

//called on UI thread
public void redraw()
{
     new Thread(setPoints).Start(); //calculating new points
}

void setPoints()
{
    PointCollection c = new PointCollection();
    //calculating points to collection
    Task.Factory.StartNew((Action<object>)((p) => { polyline.Points = (PointCollection)p; }), c);

}

編集:

ここにコーディネーターとのラインがあります

polyline.Dispatcher.Invoke((Action<PointCollection>)((p) => { polyline.Points = p; }), c);
4

2 に答える 2

2

PointCollectionはDependencyObjectであるため、1つのスレッドからインスタンス化して、他のスレッドからアクセスすることはできません。別のスレッドで計算を実行して必要なデータを生成してから、UIスレッドでPointCollectionをインスタンス化してみてください。

于 2013-01-07T00:21:07.480 に答える
1

私はあなたがこのようなことをする必要があると思います

private void reDraw()
        {
             Task<IList<Point>> calculatePointTask = Task.Factory.StartNew(() =>
            {
                //Use the list of points instead of thread-bound PointCollection
                IList<Point> pointCollection = new List<Point>();

                //Simulating that we calculate points
                Thread.Sleep(3000);

                pointCollection.Add(new Point(10,20));
                pointCollection.Add(new Point(10,20));

                return pointCollection;
            });

        calculatePointTask.ContinueWith(ante =>
            {


                var calculatedPoints = calculatePointTask.Result;

                Action<IList<Point>> updateUI = (points) =>
                    {

                        var pointCollection = new PointCollection(points);
                        polyline.Points = pointCollection;

                    };

                Application.Current.Dispatcher.Invoke(updateUI, calculatedPoints);



            }, TaskContinuationOptions.AttachedToParent);
        }

あなたの再描画機能で。

編集: ポイントを計算するときは、PointCollection インスタンスの代わりにポイントのリストを使用します

于 2013-01-07T00:07:52.203 に答える