C# Control.Refresh的解释是什么意思?

本文通过一个具体实例详细解释了在编程中使用Refresh方法的作用。当调用此方法时,控件及其子控件将立即重新绘制,即使当前方法仍在执行中。反之,如果不调用Refresh方法,则界面更新会在当前方法执行完毕后进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Control. Refresh 强制控件使其工作区无效并立即重绘自己和任何子控件。

什么意思呢,我们用实例看会很快明白:

private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
            Image myImage2;
            openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                myImage2 = System.Drawing.Image.FromFile(openFileDialog1.FileName);

                this.BackgroundImage = myImage2;//第一张图片
                this.Refresh();//注释reflesh()和不注释reflesh()的效果差异,运行程序就可以看出了
            }
            System.Threading.Thread.Sleep(1000);
            BackgroundImage = Image.FromFile(@"D:/abc.png");//第二张图片
        }

我们发现:

1不注释reflesh(),运行后,第一张图片会显示出来,等待1秒后第二张图片又显示了出来。

2注释reflesh(),运行后,第一张图片没有显示出来,等待一会儿第二张图片显示了出来。

也就是说:

没有Refresh,方法体执行期间界面保持原样,方法体执行完后才绘制方法体中所做的更改。

有Refresh,会强制立即绘制刚才所做的更改,无论方法体是否执行完。

 

原帖

http://hi.baidu.com/%C0%FA%D3%D6/blog/item/978e60883980b3ba0e24447b.html

private void Interface_Refresh1() { var lastUpdate = DateTime.Now; while (!IsExit) { try { // 按需刷新而非固定频率 if ((DateTime.Now - lastUpdate).TotalMilliseconds >= 50) // 降频到20Hz { // 统一触发UI更新 SafeUpdateUI(); lastUpdate = DateTime.Now; } // Thread.Sleep(5); // 降低CPU占用 Thread.Sleep(10); gc_time += 10; // 优化内存回收 if (gc_time >= 1000 * 60 * 5) // 5分钟 { gc_time = 0; if (System.GC.GetTotalMemory(false) > 100 * 1024 * 1024) // >100MB { PO.ClearMemory(); } } } catch { /* 添加具体异常处理 */ } } } // 创建统一的UI更新委托 private void SafeUpdateUI() { if (this.InvokeRequired) { this.BeginInvoke(new Action(SafeUpdateUI)); return; } // 1. 更新故障提示 if (TrackCollect.TrackFaultText == "") { if (label_FaultPrompt.Text != "无故障") { label_FaultPrompt.Text = "无故障"; label_FaultPrompt.ForeColor = Color.DarkGreen; } } else if (label_FaultPrompt.Text != TrackCollect.TrackFaultText) { label_FaultPrompt.Text = TrackCollect.TrackFaultText; label_FaultPrompt.ForeColor = Color.Red; } // 2. 更新通信状态 UpdateConnectionStatus(); // 3. 按页面类型更新 switch (showPage_Name) { case "btnHome": { if (!TrackCollect.StatusChange_RefreshQueue.IsEmpty) { uint track_number = TrackCollect.StatusChange_RefreshQueue.OutQueue(); if (TrackCollect.TrackDict.TryGetValue(track_number, out TrackObject track)) { track.Track_Station.Refresh_TrackStatus(); if (track_number == TrackCollect.SelectTrack_Number)//是当前选择的股道 { detailPage.Refresh_TrackStatus(); } } } } break; case "btnDetail": { // 刷新股道状态 if (!TrackCollect.StatusChange_RefreshQueue.IsEmpty) { uint track_number = TrackCollect.StatusChange_RefreshQueue.OutQueue(); if (TrackCollect.TrackDict.TryGetValue(track_number, out TrackObject track)) { track.Track_Station.Refresh_TrackStatus(); if (track_number == TrackCollect.SelectTrack_Number)//是当前选择的股道 { detailPage.Refresh_TrackStatus(); // 延时切换回主页 TimeDelay_ToHome.Start(); } } } // 刷新计轴数及轮位 if (!TrackCollect.CountWheelPosChange_RefreshQueue.IsEmpty) { uint track_number = TrackCollect.CountWheelPosChange_RefreshQueue.OutQueue(); if (TrackCollect.TrackDict.TryGetValue(track_number, out TrackObject track)) { if (track_number == TrackCollect.SelectTrack_Number)//是当前选择的股道 { detailPage.Refresh_CountWheelPos(); // 延时切换回主页 TimeDelay_ToHome.Start(); } } } //刷新工作模式 detailPage.Refresh_WorkMode(); // 计算机无操作且股道状态无变化时,切换回主页 long notime = ComputerNoOperation.GetLastInputTime(); if (notime > 5 * 60) { if (TimeDelay_ToHome.IsComplete) { SwitchPage("btnHome"); } } } break; case "btnLog": // logPage.Refesh_DataView(); break; } } // 通信状态更新封装 private void UpdateConnectionStatus() { CANConnet_State.Text = CANComm.CanOpen ? "信号箱通信:正常" : "信号箱通信:失联"; CANConnet_State.ForeColor = CANComm.CanOpen ? Color.DarkGreen : Color.Red; COMConnet_State.Text = SerialPortComm.IsConnect ? "控制台通信:正常" : "控制台通信:失联"; COMConnet_State.ForeColor = SerialPortComm.IsConnect ? Color.DarkGreen : Color.Red; } 以上为修改后的代码,依然存在CPU占用从7%缓慢增长,在运行30分钟后cpu占用30%,开始出现界面卡顿
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值