WinForm多线程及委托防止界面假死

转载 2013年12月03日 11:49:28
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())); 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>运行效果图:
作者:hsdotnet

Winform中长时间处理时良好的交互界面呈现_多线程

下面是在此期间的交互窗体,交互窗体在耗时过程中,显示一个时间提示框,用于提示系统还在进一步计算中 下面这个窗体就是弹出的这个提示窗体,即用于提示用户:“我还没挂,正在努力加载中”信息的窗体 p...

浅析.Net 在 winform及wpf中涉及界面交互的多线程类的封装

我们在开发客户端程序时,经常要用到多线程 而我们知道 , .Net 中从线程安全的考虑,对控件改变的调用要通过Invoke, beginvoke 来进行,这就涉及怎么进行工作线程与界面的互操作...

C#为什么多线程控制winform需要用委托?

C#为什么多线程控制winform需要用委托?比如我新起了一个线程A,在A线程里要对winform的list控件里显示数据,我需要用一个委托函数来实现。 因为winform是主线程创建的,你用另外一个...

多线程之winform界面的更新

错误的示例: private void btnSet_Click(object sender, EventArgs e) {        Thread t = new Thread(new ...

C# Winform 多线程下载

  • 2017年09月14日 16:15
  • 3.2MB
  • 下载

为什么使用了多线程界面假死?

为什么使用了多线程界面假死? 这里贴出两个项目(已经测试)。 先贴不正确的多线程 设计如图: 引入命名空间: using System.Threadi...

Winform多线程摇奖机

  • 2014年04月24日 17:44
  • 59KB
  • 下载

c# winform 多线程测试例子(初学)

  • 2017年11月23日 19:15
  • 194KB
  • 下载

C#多线程与UI响应 防界面假死

一. 概述 在使用C#进行应用程序设计时,经常会采用多线程的方式进行一些后台任务的工作。对于不同的应用场景,使用的策略也不尽相同。 1. 后台循环任务,少量UI更新:例如批量上传文件,并提供进...
  • l848347
  • l848347
  • 2013年01月10日 10:10
  • 1979
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinForm多线程及委托防止界面假死
举报原因:
原因补充:

(最多只允许输入30个字)