C# 在循环中触发一次通知

C# 在循环中触发一次通知,c#,C#,我有一个循环,每10秒运行一次,可以做一些事情。它所做的一件事是,当我向应用程序的用户发送消息时,它会启用一个按钮。我希望在该按钮启用时向系统托盘发送通知,但出于明显的原因,我只希望在用户有未读广播时触发该通知一次 以下是我的代码: private void EnableBroadcasts() { string query = "SELECT COUNT(*) FROM db.broadcasts WHERE broadcast_active = '1'";

我有一个循环,每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;
        }
private void EnableBroadcasts()
{
string query=“从db.broadcasts中选择COUNT(*),其中broadcast\u active='1';
int count=StoredProcedures.CountRecordsT4(查询);
StreamReader re=新的StreamReader(@“C:\\Users\\”+Environment.UserName+@“\\appdata\\Local\\Cache\\broadcasts.Cache”);
List ReadBroadcastList=新列表();
List BcastID=BroadcastID();
如果(广播计数!=计数)
{
string text=re.ReadToEnd();
re.Close();
字符串[]行=text.Split('\r');
foreach(行中的字符串s)
{
ReadBroadcastList.Add(s);
}
for(int t=0;t
当计数不为零时,按钮启用。我有一个从数据库中活动的广播ID列表,我还有一个缓存文件,记录用户读取的广播ID


我正在寻找一种仅在按钮处于活动状态且存在用户尚未读取的广播时才运行通知的解决方案。

将您的
字符串
广播包装为简单类型:
广播消息
。添加
bool IsRead
标志

标记
IsRead=true
,消息将被以下逻辑忽略

// pseudo
if (button.IsEnabled && ReadBroadcastList.Any(msg => !msg.IsRead)) {
    NotifyTray();
}
然后,您可以稍后为用户添加一项功能,以标记消息
未读

如果要将此数据持久保存在数据库中,则消息和标志都可以存储在
BroadcastMessage
对象中。当用户读取消息且对象标记为已读时,请使用更改更新数据库

更新:基于评论中的澄清

bool IsNotified
标志添加到
BroadcastMessage
通知中,并选中
!msg.IsNotified
,而不是
!msg.IsRead

,当存在未读消息时,这不是每次循环运行时都会触发通知事件吗?是的,这就是我从您的问题中理解所需行为的方式:“通知仅在按钮处于活动状态且存在用户未阅读的广播时运行。”抱歉,我希望在按钮激活时通知仅触发一次。