鉴于此代码......
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
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我收到错误,'无法在静态上下文中访问非静态方法BeginInvoke'?
我已经看过SE上的其他几个例子,大多数人试图在创建对象之前尝试使用一个字段,好像他们试图以静态方式使用非静态字段,但我不明白它是什么关于我的调用相同错误的代码.
最后,我该怎么做才能修复这个特定的问题/代码?
更新:修正标题以反映"方法"而非"财产"的问题.我还补充说,该类实现了ViewModelBase.
Fed*_*gui 33
如果这是WPF,System.Windows.Threading.Dispatcher
则没有静态BeginInvoke()
方法.
如果要静态调用(也就是说,没有对Dispatcher实例本身的引用),可以使用static Dispatcher.CurrentDispatcher
属性:
Dispatcher.CurrentDispatcher.BeginInvoke(...etc);
Run Code Online (Sandbox Code Playgroud)
但请注意,从后台线程执行此操作不会返回对"UI线程"的Dispatcher的引用,而是创建与所述后台线程关联的新Dispatcher实例.
访问"UI线程"的Dispatcher更安全的方法是使用System.Windows.Application.Current
static属性:
Application.Current.Dispatcher.BeginInvoke(...etc);
Run Code Online (Sandbox Code Playgroud)
改变这个:
Dispatcher.BeginInvoke
Run Code Online (Sandbox Code Playgroud)
对此:
Dispatcher.CurrentDispatcher.BeginInvoke
Run Code Online (Sandbox Code Playgroud)
问题是BeginInvoke
一个实例方法,需要一个实例来访问它.但是,您当前的语法试图以类BeginInvoke
的static
方式访问,Dispatcher
这就是导致此错误的原因:
无法在静态上下文中访问非静态方法BeginInvoke
归档时间: |
|
查看次数: |
22982 次 |
最近记录: |