2010-11-19 48 views
3

將類型Dictionary(Of Int16,Polygon)類型的對象作爲參數傳遞給backgroundworker以便後臺工作人員能夠訪問Dictionary中的Polygons時遇到問題。我得到了典型的「調用線程不能訪問這個對象,因爲不同的線程擁有它」的消息。繼承人我有什麼:在另一個線程中使用WPF多邊形

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

       worker.RunWorkerAsync(PolygonCollection) 

PolygonCollection是在類的頂部聲明一個私有變量,它的類型是字典(中的Int16,多邊形)。它將包含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.Item(CShort(I)))。任何幫助將非常感激。謝謝。

編輯: 因此,2友好海報幫助我縮小我的問題,但我仍然堅持如何弄清楚。

當前問題:我有一個Dictionary(Of Int16,Polygon)類型的對象。我需要能夠使用BackgroundWorker訪問在此字典內部的UI線程上創建的每個單獨的Polygon。然後在backgroundworker上,我將基於Dictionary中的Polygon創建一個位圖文件。那麼我如何才能訪問背景工作中的多邊形?謝謝你的幫助。

+0

我冒昧地修改了你的問題標題。也許這會吸引知道這些事情的人...... – Heinzi 2010-11-19 22:27:00

回答

1

問題不在於Dictionary,問題是Polygon存儲在詞典中。這些是在UI線程中創建的WPF UI元素,因此只有UI線程才能使用它們。

您可以在UI線程中執行Render操作(使用Dispatcher.Invoke)。這將意味着渲染會阻止您的UI線程,但至少在渲染操作之間的之間,UI線程將能夠處理其他事情,即,如果單次渲染操作所需的時間是UI,則UI應保持響應不要太長。

+0

有趣的..所以我需要做些什麼來讓他們或他們的副本可以訪問背景工作? – bflosabre91 2010-11-19 16:27:40

+0

以及我正在把這些多邊形和創建位圖文件從他們..所以我故意試圖在後臺線程上創建位圖,因爲10個不同的多邊形中創建10個位圖可能需要10-15秒左右。所以我使用UI線程來顯示加載動畫,以向用戶反饋它未凍結。 – bflosabre91 2010-11-19 16:32:55

+0

@bflosabre:您是否可以在後臺線程中創建多邊形? – Heinzi 2010-11-19 18:12:54

1

問題是,在WPF中,Polygon對象不能用於除創建它們之外的其他線程。這意味着您無法訪問其任何屬性,或嘗試將它們呈現爲RenderTargetBitmap

如果您在渲染所有這些圖像時嘗試不阻止UI,我建議使用Dispatcher來分解工作(安排它們的優先級爲Background)。這樣,當UI線程上發生單個保存時,Dispatcher可以交錯鼠標輸入,渲染等,以便UI不會被阻塞。