.NET C# winform窗体假死

本文探讨了WinForm窗体假死的原因和解决方案,包括调用`DoEvents`函数以及使用线程来避免阻塞UI线程。通过分析问题,提出在执行耗时操作时不应阻塞UI线程,并给出了两种实践方法。
摘要由CSDN通过智能技术生成

winform窗体假死

我们经常会遇到当执行一个比较大的函数时,窗体会出现假死的现象,给用户的体验不是很好,于是我们遇到了问题,那么就必须解决,我们该如何解决呢,首先在自己的脑里画个问号,接下来我们就一起研究吧!

先分析,这个问题是如何出现的呢!为什么会出现,如何避免出现,避免不了的,如何解决等,下面我们就去解决问题吧,遇到问题不要怕,解决问题是我们成长最快的时候,曾经别人告诉我,不怕不会做,就怕想不到。那我们就进入正题吧!

窗体假死是如何出现的呢?
在调用 testc();函数时,阻塞了UI线程,所以会出现窗体假死现象。(你在吃饭就不能去买东西。)
问题找到了,接下来我们就要想如何解决呢!
思路:1.你在吃饭的时候就不能去买东西,所以我们就必须先吃完饭,再去买。(调用DoEvents函数;主动调用Application.DoEvents 会有线程安全问题。)
思路:2.我可以找个人去帮我买东西。这就是委托,委托一个人去帮你买东西。(新开一个线程)
切记:没有必要的时候,请尽可能的少用线程。线程不易控制。
方案一:调用方法:DoEvents
Application.DoEvents();

public partial class Form1 : Form
    {
        public Form1()
        {
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
呵呵,关键自己程序里要用到 所以开发了这个小功能 很多地方很粗糙,俺菜鸟,高手们就别贬我了。 使用的时候把2个dll放到你的程序目录,在资源管理器引用LOADing.dll 就可以了,DevComponents.DotNetBar2.dll为确定按钮控件的引用 列子: private void dl_Click(object sender, EventArgs e) { LOADing.FORMshow load = new LOADing.FORMshow(); load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); },false); } private void hand(object fr) { int i = 0; while (i < 100) { i++; ((LOADing.FORMshow)((object[])(fr))[0]).send((string)((object[])(fr))[0]+i.ToString()); System.Threading.Thread.Sleep(100); } } 主要用于处理数据的时候,提示用户处理过程,防止界面假死,数据处理完毕后会自动关闭窗体。 注:this为所要调用等待窗体的主窗体对象,中间为数据传递的委托,显示数据处理的过程.load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); });中new object[] 第一个参数一定要为固定的参数:创建LOADing.FORMshow的实例,后面再就可跟任意数据,都可在方法的过程中调用显示,最后的bool参数:false方法函数执行完毕后自动关闭窗体显示;true为方法执行完毕后出现确定按钮并阻塞主线程UI,点击确定后关闭提示窗体并取消阻塞线程,这么简单,用相信大家都会用了。 界面没有进行美化,感觉这样的就可以了,随后会升级为可自定义界面! 有问题加我QQ76230454
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆皮没有豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值