Не удается получить доступ к нестационарному методу в статическом контексте?

Учитывая этот код....

public class CalibrationViewModel : ViewModelBase
{
    private FileSystemWatcher fsw;

    public CalibrationViewModel(Calibration calibration)
    {
        fsw = new FileSystemWatcher
            {
                Path = @"C:\Users\user\Desktop\Path\ToFile\Test_1234.txt",
                Filter = @"Test_1234.txt",
                NotifyFilter = NotifyFilters.LastWrite
            };

        fsw.Changed += (o, e) =>
            {
                var lastLine = File.ReadAllLines(e.FullPath).Last();
                Dispatcher.BeginInvoke((Action<string>) WriteLineToSamplesCollection, lastLine); //line that cites error
            };
    }

    private void WriteLineToSamplesCollection(string line)
    {
        // do some work
    }
}

Почему я получаю сообщение об ошибке "Не удается получить доступ к нестационарному методу BeginInvoke в статическом контексте"?

Я просмотрел несколько других примеров в SE и большинство цитировал попытку использовать поле до создания объекта, как если бы они пытались использовать статическое поле нестатичным образом, но я не понимаю, что это такое это мой код, вызывающий ту же ошибку.

Наконец, что я могу сделать, чтобы исправить эту конкретную проблему/код?

Обновление: Исправлен заголовок, чтобы отразить проблему с помощью "метода", а не "свойства". Я также добавил, что класс реализует ViewModelBase.

Ответ 1

Если это WPF, System.Windows.Threading.Dispatcher не имеет статического метода BeginInvoke().

Если вы хотите называть это статически (это значит, что без ссылки на экземпляр Dispatcher), вы можете использовать статическое свойство Dispatcher.CurrentDispatcher:

Dispatcher.CurrentDispatcher.BeginInvoke(...etc);

Имейте в виду, что выполнение этого из фонового потока НЕ ​​будет возвращать ссылку на Диспетчер потоков UI, но вместо этого создаст новый экземпляр диспетчера, связанный с указанным фоновым потоком.

Более безопасный способ доступа к Диспетчеру "UI Thread" - это использование статического свойства System.Windows.Application.Current:

Application.Current.Dispatcher.BeginInvoke(...etc);

Ответ 2

Измените это:

Dispatcher.BeginInvoke

:

Dispatcher.CurrentDispatcher.BeginInvoke

проблема BeginInvoke - это метод экземпляра и ему нужен экземпляр для доступа к нему. Однако ваш текущий синтаксис пытается получить доступ к BeginInvoke в static образом класса Dispatcher и что вызывает эту ошибку:

Невозможно получить доступ к нестационарному методу BeginInvoke в статическом контексте

Ответ 3

Это потому, что Dispatcher - это класс, а не свойство. Разве вы не должны делать свой класс CalibrationViewModel подклассом другого класса, у которого есть свойство Dispatcher?