Не удается получить доступ к нестационарному методу в статическом контексте?
Учитывая этот код....
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
?