Использование многоугольника WPF в другом потоке - PullRequest
3 голосов
/ 19 ноября 2010

У меня возникла проблема при передаче объекта типа Dictionary (Of Int16, Polygon) в качестве аргумента фоновому работнику, чтобы фоновый работник мог получить доступ к полигонам в Словаре.Я получаю типичное сообщение "Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им" сообщение.Вот что у меня есть:

                Dim worker As New BackgroundWorker
                AddHandler worker.DoWork, AddressOf MeasurePolygons
                AddHandler worker.RunWorkerCompleted, AddressOf WorkerCompleted

                worker.RunWorkerAsync(PolygonCollection)

PolygonCollection - это закрытая переменная, объявленная в верхней части класса, и она имеет тип Dictionary (Of Int16, Polygon).Он будет содержать 1-10 полигонов, и я хочу передать эту коллекцию фоновщику, потому что я делаю вычисления для каждого полигона в словаре.

    Dim TempPolygonCollection As Dictionary(Of Int16, Polygon)
    TempPolygonCollection = CType(e.Argument, Dictionary(Of Int16, Polygon))
    For i = 0 To TempPolygonCollection.Count - 1
            If TempPolygonCollection.ContainsKey(CShort(i)) Then
                Dim rtb As New RenderTargetBitmap(CInt(800), CInt(600), 96D, 96D, PixelFormats.Default)
                rtb.Render(TempPolygonCollection.Item(CShort(i)))
                Dim encoder As New BmpBitmapEncoder
                encoder.Frames.Add(BitmapFrame.Create(rtb))
            End If
    Next i

ошибка возникает в rtb.Render (TempPolygonCollection.Пункт (CShort (я))).Любая помощь могла бы быть полезна.спасибо.

РЕДАКТИРОВАТЬ: Таким образом, 2 дружественных плаката помогли мне сузить мою проблему, но я все еще застрял в том, как ее решить.

Текущая проблема: у меня есть объект типаСловарь (Int16, Полигон).Мне нужно иметь доступ к каждому отдельному полигону, который создается в потоке пользовательского интерфейса, внутри этого словаря с помощью BackgroundWorker.Затем в фоновом режиме я буду создавать растровый файл на основе многоугольника в словаре.Так как я могу получить доступ к полигонам на рабочем столе?Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Проблема в том, что в WPF объекты Polygon нельзя использовать в потоке, отличном от того, который их создал. Это означает, что вы не можете получить доступ к какому-либо из их свойств или попытаться преобразовать их в RenderTargetBitmap.

Если вы пытаетесь не блокировать пользовательский интерфейс при рендеринге всех этих изображений, я бы предложил использовать Dispatcher, чтобы разбить работу (назначьте их с приоритетом Background). Таким образом, пока в потоке пользовательского интерфейса происходит индивидуальное сохранение, Dispatcher может чередовать ввод с помощью мыши, рендеринг и т. Д., Поэтому пользовательский интерфейс не будет заблокирован.

1 голос
/ 19 ноября 2010

Проблема не в Dictionary, проблема в Polygon, хранящемся в Словаре. Это элементы пользовательского интерфейса WPF, созданные в потоке пользовательского интерфейса, поэтому их может использовать только поток пользовательского интерфейса.

Вы можете выполнить операцию Render в потоке пользовательского интерфейса (используя Dispatcher.Invoke). Это будет означать, что рендеринг блокирует ваш поток пользовательского интерфейса, но по крайней мере между операциями рендеринга поток пользовательского интерфейса будет способен обрабатывать другие вещи, то есть пользовательский интерфейс должен оставаться отзывчивым, если время, необходимое для одна операция рендеринга не слишком длинная.

...