2013-11-21 3 views
0

Я читаю значения из определенной памяти процесса. Допустим, что я за ними следующим образом:Запуск пользовательского события для «внешнего» изменения значения

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 ли и бар в этом случае)?

  • Есть ли способ заставить его работать на неблокирующей нити (возможно, с помощью Task?)?

  • Должен ли я использовать опрос, чтобы сделать эту работу?

Любой вход очень ценен!

+0

Увольнение - это работа ** провайдера ** или ** отправителя **, все подписчики или слушатели не смогут активировать событие, используя «Таймер» для опроса - это другой вид прослушивания, таким образом, это не очень хорошо, но в этом случае нам, возможно, придется это сделать. –

+0

@KingKing Да, хорошо, я не думаю о другом ... Учитывая обстоятельства – Johan

ответ

0

Я не уверен, в каком контексте вы будете использовать свою службу памяти, хотя я попытаюсь ответить на ваш quesiton.

  1. Да, вам необходимо реализовать INotifyPropertyChanged в каждом классе.
  2. Да, есть способ, Google это знает.
  3. Вы можете использовать опрос или прослушать событие PropertyChanged. Это будет подход обратного вызова, когда вы получите уведомление, когда произойдут изменения.
+0

Я не могу использовать опрос _or_ для прослушивания события. Я должен инициировать событие вручную внутри метода опроса. Не обижайтесь, но я ищу более подробный ответ. Например, каковы мои варианты запуска опроса на неблокирующем потоке? Задания? Таймеры? «Google - ваш друг» - это не ответ, imho. – Johan

+0

Я хотел бы предоставить вам подробный ответ или даже решение только из кода, который вы нам дали, и из описания, которое вы предоставили для использования, я могу просто отсылать вас к Google. Вы спрашиваете, как делать опросы. Этот ответ можно было найти в Google в кратчайшие сроки. –

+0

Ваше недоразумение, если вы думаете, что я спрашиваю _how_. Я прошу наиболее подходящий подход для этого сценария, так как я знаю, что есть некоторые альтернативы. – Johan

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 
} 

Вы можете узнать больше об использовании delegate объектов из Delegates (C# Programming Guide) страницы на сайте MSDN.

+0

Выглядит хорошо, за исключением того факта, что мне нужно включить это в таймер или подобное, не так ли? – Johan

+1

Нет, вы можете работать, когда вы запрашиваете данные в своем классе 'MemoryService' любым способом, который вы хотите ... это просто дает вам возможность получить результаты от него. Вы можете * использовать 'DispatcherTimer' в этом классе для опроса данных, а затем использовать этот метод, чтобы вернуть его в основную модель представления. – Sheridan

Смежные вопросы