当有大量数据需要计算、显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决。

using System;
using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApplication1

{

public partial class FormMain : Form

{

DataTable table;

int currentIndex = 0;

int max = 10000;

public FormMain()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

button1.Enabled = false;

Thread thread = new Thread(new ThreadStart(LoadData));

thread.IsBackground = true;

thread.Start();

progressBar1.Minimum = 0;

progressBar1.Maximum = max;

}

private void LoadData()

{

SetLableText("数据加载中...");

currentIndex = 0;

table = new DataTable();

table.Columns.Add("id");

table.Columns.Add("name");

table.Columns.Add("age");

while (currentIndex < max)

{

SetLableText(string.Format("当前行:{0},剩余量:{1},完成比例:{2}%", currentIndex, max - currentIndex,

(Convert.ToDecimal(currentIndex) / Convert.ToDecimal(max) * 100).ToString("f0")));

SetPbValue(currentIndex);

DataRow dr = table.NewRow();

dr["id"] = currentIndex;

string name = "张三";

dr["name"] = name;

dr["age"] = currentIndex + 5;

table.Rows.Add(dr);

currentIndex++;

}

SetDgvDataSource(table);

SetLableText("数据加载完成!");

this.BeginInvoke(new MethodInvoker(delegate()

{

button1.Enabled = true;

}));

}

delegate void labDelegate(string str);

private void SetLableText(string str)

{

if (label1.InvokeRequired)

{

Invoke(new labDelegate(SetLableText), new string[] { str });

}

else

{

label1.Text = str;

}

}

delegate void dgvDelegate(DataTable table);

private void SetDgvDataSource(DataTable table)

{

if (dataGridView1.InvokeRequired)

{

Invoke(new dgvDelegate(SetDgvDataSource), new object[] { table });

}

else

{

dataGridView1.DataSource = table;

}

}

delegate void pbDelegate(int value);

private void SetPbValue(int value)

{

if (progressBar1.InvokeRequired)

{

Invoke(new pbDelegate(SetPbValue), new object[] { value });

}

else

{

progressBar1.Value = value;

}

}

}

}

运行效果图:

}<br>运行效果图:

WinForm多线程及委托防止界面假死的更多相关文章

  1. WinForm多线程+委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...

  2. WinForm查询大数据界面假死,使用异步调用解决

    用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...

  3. C#中异步及winform中界面假死

    c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke. 主要区别是controll ...

  4. WinForm程序界面假死,寻求完美解决方案

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  5. C# Winform 窗体界面”假死”后台线程阻塞 解决办法–BeginInvoke

    原文:C# Winform 窗体界面"假死"后台线程阻塞 解决办法–BeginInvoke 这个方法可以用在任何后台任务耗时较长,造成界面“假死”界面控件不更新的情况. 比如要要执 ...

  6. Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good

    QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...

  7. 使用publisher模式控制频繁的UI输出,避免Winform界面假死

    http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出 ...

  8. 解决c# progressBar更新出现界面假死

    最近一个项目需求中的一个功能是需要用progressBar反映处理文件的进度. 研究了Invoke和BeginInvoke方法. Control.Invoke 方法 (Delegate) :在拥有此控 ...

  9. C# 委托 线程 窗体假死

    转载:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html 异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能. ...

随机推荐

  1. 网络IPC:套接字之带外数据

    带外数据(Out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输.即使传输队列已经有数据,带外数据先行传输.TCP支持带外数据,但是UDP不支持.套接 ...

  2. UNIX基础知识之文件和目录

    程序清单1-1 列出一个目录中的所有文件(ls命令的简要实现): [root@localhost unix_env_advance_prog]# cat prog1-.c #include " ...

  3. Android:TabHost实现Tab切换

    TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容. 实现方式有两种: 1.继承TabA ...

  4. MySQL查询缓存详解

    一:缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELE ...

  5. Linux命令行技巧

    Linux命令行技巧 命令 描述 • apropos whatis 显示和word相关的命令. 参见线程安全 • man -t man | ps2pdf - > man.pdf 生成一个PDF格 ...

  6. ArcGIS: version not specified. You must call RuntimeManager.Bind before creat

    打开program.cs把ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);这句放到Applicatio ...

  7. 【Java Tips】boolean的类型与string类型的转换

    boolean类型转化为string boolean b = true; String s = String.valueOf(b); System.out.println(s);

  8. VMware系统运维(一)安装Esxi

    1.下载ISO文件,开始安装,如图1,直接按回车进行安装. 图1 2.按回车键继续安装,如图2所示 图2 3.选择要安装系统的磁盘,按回车继续,如图3所示 图3 4.选择对应的键盘语言,按回车继续,如 ...

  9. linux cd

    cd -回到上一次 操作的目录 cd ..回到上级目录 cd ../../回到上两级目录

  10. Adobe Edge Animate –使用EdgeCommons加载和播放音频

    Adobe Edge Animate –使用EdgeCommons加载和播放音频 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在Edge中,可以new一 ...