Как получить доступ к свойству пользовательского элемента управления внутри потока (Publi c Stati c void) - PullRequest
1 голос
/ 25 мая 2020

Как исправить эту ошибку:

Ошибка: ключевое слово 'this' недействительно в свойстве stati c, stati c метод или stati c инициализатор поля

Вот ошибочный код:

private void proxietype_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Dispatcher.BeginInvoke(((Action)delegate
    {
        Thread t = new Thread(new ThreadStart(() => Check()));
        t.Start();
    }));
}

public static void Check()
{
    ((UserControlVPN)Window.GetWindow(this)).notification.IsActive = true;
    main.notification.IsActive = true;
    main.notification.Message.Content = "Please wait";
}

Здесь как на картинке:

1 Ответ

0 голосов
/ 25 мая 2020

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...