10

Given this code....

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
    }
}

Why am I getting the error, 'Cannot access non-static method BeginInvoke in static context'?

I have looked at several other examples on SE and most cite trying to use a field before the object is created as if they were trying to use a non-static field in a static manner, but I don't understand what it is about my code that is invoking the same error.

Lastly, what can I do to fix this specific issue/code?

Update: Fixed title to reflect issue with a 'method' and not a 'property'. I also added that the class implements ViewModelBase.

4

3 に答える 3

42

これが WPF の場合、静的メソッドSystem.Windows.Threading.Dispatcherはありません。BeginInvoke()

これを静的に呼び出したい場合 (つまり、Dispatcher インスタンス自体への参照を持たない場合)、静的Dispatcher.CurrentDispatcherプロパティを使用できます。

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

ただし、バックグラウンド スレッドからこれを行うと、「UI スレッド」の Dispatcher への参照が返されず、そのバックグラウンド スレッドに関連付けられた新しい Dispatcher インスタンスが作成されることに注意してください。

「UI スレッド」の Dispatcher にアクセスするより安全な方法は、System.Windows.Application.Current静的プロパティを使用することです。

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

これを変える:

Dispatcher.BeginInvoke

これに:

Dispatcher.CurrentDispatcher.BeginInvoke

問題はBeginInvokeインスタンスメソッドであり、それにアクセスするにはインスタンスが必要です。ただし、現在の構文はクラス外の方法でBeginInvokeアクセスしようとしており、それがこのエラーの原因です:staticDispatcher

静的コンテキストで非静的メソッド BeginInvoke にアクセスできません

于 2013-06-03T20:03:43.530 に答える