微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 无法访问静态上下文中的非静态方法?

鉴于此代码……
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.

解决方法

如果这是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);

原文地址:https://www.jb51.cc/csharp/98824.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐