我意識到我之前問過一個非常類似的問題,但是我的結構是錯誤的。我錯誤地認爲我可以在Invoke中執行我的圖標生成。這導致了一個不同的問題。不確定如何在線程之間傳遞對象
我有一個包含500個SVG的文件夾。我想創建文件夾中每個SVG的對象。我需要在單獨的線程上執行此操作,因爲它可能需要一些時間才能完成,並鎖定了UI。
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Thread t = new Thread(LoadIcons);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
private void LoadIcons()
{
//Populate ListOfSVGsInFolder
Foreach(String SVGFile in ListOfSVGsInFolder)
{
Icon icon = new Icon
//Perform ~50 lines of code which get the paths and other details from the
//SVGFile and plug them into my icon object
//Now I had a fully generated Icon
//Add the icon to the form
WrapPanel.Children.Add(icon)
}
}
我的問題是我不能將圖標添加到WrapPanel。因爲我想要在單獨的線程上執行此代碼,所以我無法直接與UI交談。不過,我可以這樣做:
Foreach(String SVGFile in ListOfSVGsInFolder)
{
Icon icon = new Icon
//Perform ~50 lines of code which get the paths and other details from the
//SVGFile and plug them into my icon object
Dispatcher.Invoke(new Action(() =>
{
WrapPanel.Children.Add(icon);
}));
}
但在這樣做,現在我可以不再試圖將其添加到WrapPanel當訪問我的圖標對象。
基本上,我希望能夠在文件夾中找到的SVG上執行所有這些計算,在同一個線程中創建SVG的對象,然後將這些對象添加到UI中。
你需要的數據結構(列表/堆棧/ fifo),它由一個線程寫入並由另一個線程讀取。在訪問它之前,你需要鎖定()這個結構。 – DrKoch
@DrKoch感謝您的評論。你有任何鏈接到這個正在申請?我對線程很陌生。 – Ralt
查看更完整的答案 – DrKoch