2013-11-21 58 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

觸發事件是**提供者**或**發送者**的工作,所有的訂閱者或監聽者都無法觸發事件,使用'Timer'來輪詢是另一種監聽,以這種方式發射事件並不是很好,但在這種情況下,我們可能必須這樣做。 –

+0

@KingKing是啊,我沒有想到任何其他方式......考慮到情況 – Johan

回答

0

我不確定在什麼情況下你會使用你的記憶服務,但我會試着回答你的問題。

  1. 是的,你將不得不在每個類中實現INotifyPropertyChanged。
  2. 是的,有一種方式,谷歌知道它。
  3. 您可以使用輪詢或者您可以收聽PropertyChanged事件。這將是您發生更改時得到通知的回調方法。
+0

我不能使用輪詢或監聽事件。我必須在輪詢方法內手動觸發事件。沒有冒犯,但我正在尋找更詳細的答案。例如,我有關於在非阻塞線程上運行輪詢的選項是什麼?任務?計時? 「谷歌是你的朋友」 - 答案不是很多答案,恕我直言。 – Johan

+0

我想爲您提供一個詳細的答案,甚至是一個解決方案,只需從您提供給我們的代碼以及您提供的描述中使用,我就可以將您推薦給Google。你在問怎麼做投票。這個答案很快就能在谷歌上找到。 –

+0

如果你認爲我在問_how_,那麼你錯誤地理解了我。我要求爲這種情況提供最合適的方法,因爲我知道有一些替代方案。 – Johan

1

如果你從你的主視圖模型訪問您的MemoryService,那麼你可以定義一個簡單的delegate解決您的問題。

在你MemoryService,定義delegate及相關屬性:

public delegate void DataUpdate(object someData); 

public DataUpdate OnDataUpdate { get; set; } 

在父視圖模型,附加的處理程序delegate:在MemoryService

MemoryService memoryService = new MemoryService(); 
memoryService.OnDataUpdate += MemoryService_OnDataUpdate; 

背的時候,數據準備好:

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 
} 

你可以找到更多關於使用從Delegates (C# Programming Guide)頁面上MSDN delegate對象。

+0

看起來不錯,除了我需要將其包含在計時器或類似的事實中,對吧? – Johan

+1

不,你可以在任何時候以你想要的方式請求你的「MemoryService」類中的數據......這只是爲你提供一種從中得到結果的方法。你*可以*使用該類中的DispatcherTimer來輪詢數據,然後使用此方法將其返回到主視圖模型。 – Sheridan