2016-12-14 77 views
2

我有一個每10秒運行一次的循環,它會執行一些操作。它所做的一件事就是當有消息發送給應用用戶時,它會啓用按鈕。我想在按鈕啓用時向系統托盤發送通知,但由於顯而易見的原因,我只希望在用戶有未讀廣播時觸發一次通知。在循環中觸發通知一次

這裏是我的代碼:

private void EnableBroadcasts() 
    { 
     string query = "SELECT COUNT(*) FROM db.broadcasts WHERE broadcast_active = '1'"; 
     int count = StoredProcedures.CountRecordsT4(query); 
     StreamReader re = new StreamReader(@"C:\\Users\\" + Environment.UserName + @"\\appdata\\Local\\Cache\\broadcasts.cache"); 
     List<string> ReadBroadcastList = new List<string>(); 
     List<string> BcastID = BroadcastID(); 
     if (BroadcastCount != count) 
     { 
      string text = re.ReadToEnd(); 
      re.Close(); 
      string[] lines = text.Split('\r'); 
      foreach (string s in lines) 
      { 
       ReadBroadcastList.Add(s); 
      } 
      for (int t = 0; t < ReadBroadcastList.Count(); t++) 
      { 
       ReadBroadcastList[t] = ReadBroadcastList[t].Trim('\n'); 
      } 
      ReadBroadcastList.Remove(""); 
      BroadcastCount = ReadBroadcastList.Count(); 

     } 
     var test = BcastID.Except(ReadBroadcastList).ToList(); 
     int read = test.Count(); 
     if (count != 0) 
     { 
      btnWESBroadcast.Visible = true; 
     } 
     else 
     { 
      btnWESBroadcast.Visible = false; 
     } 

按鈕使一次計數不爲零。我有從數據庫活動的廣播ID列表,我也有一個緩存文件,記錄該用戶已讀取的廣播ID。

我正在尋找一種解決方案,只有當按鈕處於活動狀態並且存在用戶尚未閱讀的廣播時纔會運行通知。

回答

3

用簡單的方式包裝你的string廣播:BroadcastMessage。添加bool IsRead標誌。

馬克IsRead = true和消息將被忽略以下邏輯。

// pseudo 
if (button.IsEnabled && ReadBroadcastList.Any(msg => !msg.IsRead)) { 
    NotifyTray(); 
} 

然後您可以稍後添加一個功能,以便用戶標記消息Unread

如果您打算將此數據保存在數據庫中,則消息和標誌都可以存儲在BroadcastMessage對象中。當用戶讀取消息並將對象標記爲已讀時,請使用更改更新數據庫。

更新:基於澄清評論
添加bool IsNotified標誌的BroadcastMessage通知和檢查!msg.IsNotified!msg.IsRead代替

+0

當沒有未讀消息時,每次循環運行時都不會觸發通知事件嗎? –

+0

是的,這就是我如何理解你的問題所需的行爲:「*通知只在按鈕處於活動狀態並且有用戶沒有閱讀的廣播時運行*」 – IAbstract

+0

道歉,我正在尋找的是隻有當按鈕激活時,通知纔會觸發一次。 –