更新太快时,导致winform崩溃的问题

最近发现个问题:
后台更新数据,winform显示出来,这一很平常的工作,竟然导致winform崩溃了!
分析问题:
通过调试发现,采用事件-响应模式进行消息传递时,由于后台数据更新太快,导致winform的内容没法及时更新,积累一定时间后就崩溃了!
解决方法:
貌似我们对于winform的更新不能简单的采用事件-响应模式,需要winform主动定时索取数据(200毫秒一次就足够了,或者更慢也行),这样能解决后台更新太快的问题,一段演示代码:

public partial class LogWin : Form
	{
		/// <summary>
		/// 更新频率
		/// </summary>
		private int UpdateRate;
		/// <summary>
		/// 更新的间隔时间
		/// </summary>
		private int Delta;
		/// <summary>
		/// 更新的线程
		/// </summary>
		private Thread thread;
		/// <summary>
		/// 允许当前窗口进行更新
		/// </summary>
		private bool IsUpdating;
		/// <summary>
		/// 构造函数
		/// </summary>
		public LogWin()
		{
			CheckForIllegalCrossThreadCalls = false;
			InitializeComponent();
			FormClosing += new FormClosingEventHandler(On_Closing);
			UpdateRate = 1;
			Delta = 1000 / UpdateRate;
		}
		/// <summary>
		/// 清理一些数据
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void On_Closing(object sender, FormClosingEventArgs e)
		{
			IsUpdating = false;
			if (thread != null) thread.Abort();
		}
		/// <summary>
		/// 开始更新数据
		/// </summary>
		public void StartUpdate()
		{
			IsUpdating = true;
			thread = new Thread(MUpdate);
			thread.Start();

		}
		/// <summary>
		/// 更新界面
		/// </summary>
		private void MUpdate()
		{
			while (IsUpdating)
			{
				RT1.Text = God.Get_LogString();
				Thread.Sleep(Delta);
			}
		}
		/// <summary>
		/// 显示窗口
		/// </summary>
		public new void Show()
		{
			StartUpdate();
			base.Show();
		}
		/// <summary>
		/// 测试数据,暂定数据更新
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void button1_Click(object sender, System.EventArgs e)
		{
			IsUpdating = false;
		}
		/// <summary>
		/// 测试数据,继续更新
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void button2_Click(object sender, System.EventArgs e)
		{
			StartUpdate();
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值