Итак, я понимаю, что вам разрешен доступ к элементу управления пользовательского интерфейса только из потока, в котором он был создан, но я получаю сообщение об ошибке, жалующееся на строку «this.Close()». Я пытаюсь запустить поток, который открывает заставку с анимацией OpenTK.
ОШИБКА: «Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток».
Вот код:
public MainWindow()
{
InitializeComponent();
closeSplashBool = false;
Thread t = new Thread(() =>
{
openSplash = new SplashScreen();
openSplash.Show();
}
);
t.SetApartmentState(ApartmentState.STA);
t.Start();
///
/// Long running task
///
closeSplashBool = true;
}
Единственная строка кода в конструкторе SplashScreen — InitializeComponents(). Вот моя функция анимации для класса SplashScreen (который управляет закрытием экрана-заставки):
private void splashControl_Paint(object sender, PaintEventArgs e)
{
//make sure our GL control has loaded
if (!loaded)
return;
if (animCount <= 0 )
{
Thread.Sleep(200);
if (MainWindow.closeSplash)
this.Close(); //program crashes on this line
}
else if (animCount < 3.75 && animCount >=2.75)
{
animCount -= .2f;
System.Threading.Thread.Sleep(1);
}
else if (animCount < 2.75)
{
animCount -= .07f;
System.Threading.Thread.Sleep(5);
}
else
{
animCount -= .7f;
System.Threading.Thread.Sleep(1);
if (animCount < 0)
animCount = 0;
}
Render();
}
Я сделал «новый» экран-заставку в потоке «t», поэтому я решил, что вызов «this.Close()» не будет иметь никаких нарушений прав доступа. Мой вопрос: почему я получаю это нарушение прав доступа? Я попытался заменить «this.close» на «Dispatcher.InvokeShutdown» по предложениям других, но заставка так и не исчезла.
Close
на экране-заставке. - person Jim Mischel   schedule 18.07.2014