Я хочу динамически создавать пользовательские элементы управления в разных потоках. Мой кодОшибка при доступе к переменной, созданной в другом потоке
var thread = new Thread(() =>
{
var uc = new UserControl05();
UserControl item = uc;
Parallel.ForEach(_allTabs, currentTab =>
{
if (currentTab.DocumentWindow.CheckAccess())
{
if (currentTab.DocumentWindow.IsSelected)
{
//some code
}
}
else
{
currentTab.DocumentWindow.Dispatcher.BeginInvoke(new Action(() =>
{
if (!currentTab.DocumentWindow.IsSelected) return;
if (currentTab.AnimatedCanvas.CheckAccess())
{
currentTab.AnimatedCanvas.Children.Add(item); //here I get error
}
else
{
currentTab.AnimatedCanvas.Dispatcher.BeginInvoke(new Action(() =>
{
currentTab.AnimatedCanvas.Children.Add(item);
}));
}
}));
}
});
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Name = "Create Control";
thread.Start();
Я получаю ошибку вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет он. Я искал решение и пытался использовать диспетчер там, но он не помогает и бросает ту же ошибку. Я понимаю, что это происходит потому, что я создал usercontrol в фоновом потоке, но как исправить это, я понятия не имею.
Может кто-нибудь что-нибудь предложить?
Вы не можете создать элемент управления в другом потоке ... –
Есть ли возможность сделать это? Или я должен сделать это только по основной теме? – Sasha
Используйте основной (то есть пользовательский) поток, в котором вы будете использовать элемент управления, вы все равно можете манипулировать им в других потоках через 'Диспетчер'. –