最近发现个问题:
后台更新数据,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();
}