我正在从某个进程内存中读取值。假设我以下列方式获取它们:
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
?)?
我是否必须使用轮询来完成这项工作?
非常感谢任何输入!
答案 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)
我不确定你将在什么情况下使用你的记忆服务,虽然我会尝试回答你的问题。