触发自定义事件以进行“外部”值更改

时间:2013-11-21 12:47:59

标签: c# wpf winforms

我正在从某个进程内存中读取值。假设我以下列方式获取它们:

var foo = memoryService.GetFoo();
var bar = memoryService.GetBar();

由于它不存在任何内存更改事件,我想使用轮询创建自定义事件(如果您没有任何其他建议)。

由于我不知道值何时可能发生变化,因此必须将轮询间隔设置为合适的值。我不知道如何写这个,但这样的事情可能会做(不确定它是否编译):

public class MemoryChange : INotifyPropertyChanged
{
    private Timer _timer;

    public SomethingChanged(double polingInterval)
    {
        _timer = new Timer();
        _timer.AutoReset = false;
        _timer.Interval = polingInterval;
        _timer.Elapsed += timer_Elapsed;
        _timer.Start(); 
    }

    private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {

    }
}
  • 我是否需要为每个值创建一个实现INotifyPropertyChanged的类(在这种情况下为foo和bar)?

  • 有没有办法让它在非阻塞线程上运行(或许使用Task?)?

  • 我是否必须使用轮询来完成这项工作?

非常感谢任何输入!

2 个答案:

答案 0 :(得分:1)

如果您可以从主视图模型访问MemoryService,那么您可以定义一个简单的delegate来解决您的问题。

MemoryService中,定义delegate及相关媒体资源:

public delegate void DataUpdate(object someData);

public DataUpdate OnDataUpdate { get; set; }

在父视图模型中,附加delegate

的处理程序
MemoryService memoryService = new MemoryService();
memoryService.OnDataUpdate += MemoryService_OnDataUpdate;

数据准备好后返回MemoryService

var foo = memoryService.GetFoo();
// Always check for null
if (OnDataUpdate != null) OnDataUpdate(foo);

现在在父视图模型中:

public void MemoryService_OnDataUpdate(object someData)
{
    // Do something with the new data here
}

您可以在MSDN上的Delegates (C# Programming Guide)页面上找到有关使用delegate个对象的详情。

答案 1 :(得分:0)

我不确定你将在什么情况下使用你的记忆服务,虽然我会尝试回答你的问题。

  1. 是的,您必须在每个班级实施INotifyPropertyChanged。
  2. 是的,有一种方法,谷歌知道。
  3. 您可以使用轮询,也可以收听PropertyChanged事件。这将是回调方法,您可以在发生更改时收到通知。