Я понял, что раньше задавал очень похожий вопрос, однако моя структура была неправильной. Я ошибался, думая, что смогу выполнить свое создание иконок в Invoke. Это привело к другой проблеме.Не уверен, как пройти объект между потоками
У меня есть папка с 500 SVG. Я хочу создавать объекты каждого SVG в папке. Мне нужно сделать это на отдельном потоке, так как это может занять некоторое время и блокирует пользовательский интерфейс.
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. Поскольку я хочу, чтобы этот код выполнялся в отдельном потоке, я не могу напрямую разговаривать с пользовательским интерфейсом. Тем не менее, я мог бы сделать:
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 в одном потоке, а затем добавлять эти объекты в пользовательский интерфейс.
Вам нужна структура данных (список/стек/fifo), который записывается одним потоком и считывается другим потоком. Перед его доступом вам необходимо заблокировать() эту структуру. – DrKoch
@DrKoch Спасибо за комментарий. У вас есть ссылки на это приложение? Я очень новичок в потоковом режиме. – Ralt
см. Более полный ответ – DrKoch