C# Timer中改变控件的值,无变化,该怎么解决?

weixin_39351974 2017-12-07 11:32:11
TCP连接客户端,断开连接后,我从集合移除,并显示在dataGridView,这样没有变化,我试着在if (span.TotalSeconds > OverTime) 前后分别加了,一个label值变化,放在前面,会变化,后面就不会。
调试时,也都执行到了,111也赋在label4了,但界面的值就是不变化,下次进入调试时,label4的值时label4,不是111

private void HeartCheck_Tick(object sender, EventArgs e)
{
TimeSpan span = new TimeSpan();
RemoveSocketName = new List<string>();
foreach (var item in HeartList)
{

span = DateTime.Now - item.LastConnectTime; //心跳包检测
// label4.Text = "111"; //放在此处,label4值有变化
if (span.TotalSeconds > OverTime) //超时时间
{
// label4.Text = "111"; //放在此处,label4值无变化,调试时也执行到这步了,但没改变
dicSocket.Where(u => u.Key == item.SocketName).FirstOrDefault().Value.Close();
dicSocket.Remove(item.SocketName);
for (int i = 0; i < dataGridView2.Rows.Count; i++)
{

if (dataGridView2.Rows[i].Cells[1].Value.ToString() != "" && item.SocketName.Contains(dataGridView2.Rows[i].Cells[1].Value.ToString()))
{
dataGridView2.Rows[i].Cells[3].Value = "离线";
break;
}
}
RemoveSocketName.Add(item.SocketName);
CommandList.Remove(item.SocketName);
}
}
foreach (var item in RemoveSocketName) //移除心跳包集合
{
HeartList.Remove(HeartList.Where(u => u.SocketName == item).FirstOrDefault());
}

}
...全文
676 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_39351974 2017-12-18
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
等 foreach (var item in HeartList) 循环和 foreach (var item in RemoveSocketName) 循环结束了,自然就会有显示 你总不会告诉我说是死循环吧?
我纳闷,之前不行。今天一测试,又正常显示了
小猫阿尤 2017-12-15
  • 打赏
  • 举报
回复
建议看看多线程 委托 和跨线程访问ui控件方面的知识
xinbada1985 2017-12-15
  • 打赏
  • 举报
回复
必须等方法执行完了才会刷新页面,最好做一个事件委托来搞就可以了
SoulRed 2017-12-14
  • 打赏
  • 举报
回复
UI界面的更新需要用委托才能更新,防止多线程调用导致的混乱
xuzuning 2017-12-14
  • 打赏
  • 举报
回复
等 foreach (var item in HeartList) 循环和 foreach (var item in RemoveSocketName) 循环结束了,自然就会有显示 你总不会告诉我说是死循环吧?
Jason_Mao1 2017-12-14
  • 打赏
  • 举报
回复
给你提示一下给个思路,要么用委托,要么用线程去搞。希望能帮助到你。
  • 打赏
  • 举报
回复
你要更新控件内容,需要在你的时钟里调用委托的,,,在委托的方法里才能更新窗体的控件内容
youyubianyuan 2017-12-14
  • 打赏
  • 举报
回复
帮顶!帮顶!帮顶!帮顶!帮顶!
weixin_39351974 2017-12-07
  • 打赏
  • 举报
回复

private void HeartCheck_Tick(object sender, EventArgs e)
        {
            TimeSpan span = new TimeSpan();
            RemoveSocketName = new List<string>(); 
            foreach (var item in HeartList)
            {
                
                span = DateTime.Now - item.LastConnectTime;         //心跳包检测
             //   label4.Text = "111";              //放在此处,label4值有变化
                if (span.TotalSeconds > OverTime)                            //超时时间
                {
             //       label4.Text = "111";            //放在此处,label4值无变化,调试时也执行到这步了,但没改变
                    dicSocket.Where(u => u.Key == item.SocketName).FirstOrDefault().Value.Close();
                    dicSocket.Remove(item.SocketName);
                    for (int i = 0; i < dataGridView2.Rows.Count; i++)
                    {

                        if (dataGridView2.Rows[i].Cells[1].Value.ToString() != "" && item.SocketName.Contains(dataGridView2.Rows[i].Cells[1].Value.ToString()))
                        {
                            dataGridView2.Rows[i].Cells[3].Value = "离线";
                            break;
                        }
                    }
                    RemoveSocketName.Add(item.SocketName);
                    CommandList.Remove(item.SocketName);
                }
            }
            foreach (var item in RemoveSocketName)                  //移除心跳包集合
            {
                HeartList.Remove(HeartList.Where(u => u.SocketName == item).FirstOrDefault());
            }

        }




110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧