1) Вам не нужен Dispatcher
для асинхронного запуска Thread
или Task
2) Используйте Task
вместо Thread
3) Вы можете получить доступ к экземпляру через поле stati c, назначенное, например, в конструкторе
4) Также вы можете получить исключение при доступе к свойствам Window
не из основного пользовательского интерфейса Thread
. Здесь вам понадобится Dispatcher
.
private void proxietype_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Task.Run(() => Check());
}
// define static field
private static UserControlVPN _thisWindow;
public UserControlVPN()
{
// assign instance to the field in constructor
_thisWindow = (UserControlVPN)Window.GetWindow(this);
}
public static void Check()
{
Dispatcher.BeginInvoke((Action)() =>
{
_thisWindow.notification.IsActive = true;
_thisWindow.notification.Message.Content = "Please wait";
});
//...
}
Или вы можете просто удалить static
. Поскольку с этой реализацией у вас может быть только один экземпляр UserControl
без проблем.
5) Лучше использовать подход async/await
и изменять свойства окна за пределами Task
.
private async void proxietype_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
proxietype.Enabled = false;
main.notification.IsActive = true;
main.notification.Message.Content = "Please wait";
await Task.Run(() => Check());
main.notification.Message.Content = "";
main.notification.IsActive = false;
proxietype.Enabled = true;
}
public static void Check()
{
// do job...
}
Убедитесь, что у вас нет возможных необработанных исключений внутри Check()
.