我有一个每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。
我正在寻找一种解决方案,只有当按钮处于活动状态并且有一个用户尚未阅读的广播时才会运行通知。
答案 0 :(得分:3)
以简单类型包裹您的string
广播:BroadcastMessage
。添加bool IsRead
标记。
标记IsRead = true
,将使用以下逻辑忽略该消息。
// pseudo
if (button.IsEnabled && ReadBroadcastList.Any(msg => !msg.IsRead)) {
NotifyTray();
}
然后,您可以稍后为用户添加标记邮件Unread
的功能。
如果您打算在数据库中保留此数据,则消息和标志都可以存储在BroadcastMessage
对象中。当用户读取消息并将对象标记为已读时,请使用更改来更新数据库。
更新:基于评论中的澄清
在bool IsNotified
通知中添加BroadcastMessage
标记,然后检查!msg.IsNotified
的{{1}} 。