10

鉴于此代码....

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。

4

3 回答 3

42

如果这是 WPF,System.Windows.Threading.Dispatcher则没有静态BeginInvoke()方法。

如果你想静态调用它(也就是说,没有对 Dispatcher 实例本身的引用),你可以使用静态Dispatcher.CurrentDispatcher属性:

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

但请注意,从后台线程执行此操作不会返回对“UI 线程”的 Dispatcher 的引用,而是创建与所述后台线程关联的 NEW Dispatcher 实例。

访问“UI Thread”的 Dispatcher 的更安全的方法是使用System.Windows.Application.Current静态属性:

Application.Current.Dispatcher.BeginInvoke(...etc);
于 2013-06-03T20:04:24.027 回答
9

改变这个:

Dispatcher.BeginInvoke

对此:

Dispatcher.CurrentDispatcher.BeginInvoke

问题是BeginInvoke一个实例方法,需要一个实例来访问它。但是,您当前的语法正在尝试以类外BeginInvokestatic方式访问,Dispatcher这就是导致此错误的原因:

无法在静态上下文中访问非静态方法 BeginInvoke

于 2013-06-03T20:03:43.530 回答
3

这是因为Dispatcher是一个类而不是一个属性。你不应该让你CalibrationViewModel的类成为其他有Dispatcher属性的类的子类吗?

于 2013-06-03T20:01:14.737 回答