2016-07-01 128 views
0

我的情況線程之間的GeometryCollection:如何通過

我想畫一個地圖,由不同的層。

到目前爲止,我使用ItemsControl來顯示所有的層:

<ItemsControl ItemsSource="{Binding Layers}" 
       ItemTemplate="{StaticResource LayerViewTemplate}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

我用的模板看起來是這樣的:

<DataTemplate x:Key="LayerViewTemplate" 
       DataType="{x:Type data:InformationLayer}"> 
     <Path StrokeThikness="{Binding W}" 
      Stroke="Black" 
      Data = {Binding Data}/> 
    </DataTemplate> 

正如你所看到的,類InformationLayer包含了所有的一層的數據。這包括:

public GeometryGroup Data { get; protected set; } 

生成圖層是一個漫長的過程艱難。 我必須閱讀一堆文件等 這就是爲什麼我想在異步功能中做到這一點。

問題:

GeometryGroup對象屬於創建它們的線程。 所以,如果我使用不同的線程來創建我的圖層,它們將屬於該線程。 我希望它們屬於我的主線程,因爲我想將它們用作綁定源。 是否有可能將GeometryGroup從一個線程移動到另一個線程?

到目前爲止,生成我的圖層的函數如下所示: 但最後一行引發異常,因爲wpf不想綁定到已在其他線程中生成的對象。

protected async void generateLayers() 
    { 
     var progress = new Progress<RefreshLayersProgressReport>(ReportLayerProgress); 
     var ans = await Task.Run(() => refreshLayers(progress)); 

     Layers = ans; 
    } 
+0

線程運行一個單獨的進程,因此您需要在線程開始時將所有數據傳遞給線程或使用管道。一個簡單的管道可以與MemoryStream類一起使用。 – jdweng

回答

1

GeometryGroup源自Freezable。所以在調用其Freeze()方法後,它應該是跨線程可訪問的。

Freezable頁上的線程安全部分:

當IsFrozen屬性是假的,可凍結對象可以是 只能從創建它的線程訪問。試圖從 從另一個線程訪問它將引發InvalidOperationException。 Dispatcher.Invoke和Dispatcher.BeginInvoke方法提供支持 以編組到正確的線程。

當它們的IsFrozen屬性爲true時,Freezable對象爲自由線程的 。有關更多信息,請參閱Freezable對象概述。

+0

啊啊謝謝。由於創建後我不需要修改'GeometryGroup',所以這對我來說非常合適。 –