这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下。

主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入到xml excel等。做了个小实例模拟了一下。特此帖出来以便日后查阅

先上效果图

然后贴上代码

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Windows.Forms; namespace AsyncCallBack用法
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
} /// <summary>
/// 定义字段来存放读取到的数据
/// </summary>
DataTable dtInput = new DataTable();
/// <summary>
/// 定义字段来存放写入的数据
/// </summary>
DataTable dtOutput = new DataTable(); /// <summary>
/// 按钮单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//先记录下时间
Stopwatch sw = Stopwatch.StartNew();
//定义一个委托变量用来生成数据
Func<int, DataTable> func = GetTableData;
//异步开始
func.BeginInvoke(, ImproveTable, null);
//记录时间
sw.Stop();
//测试异步会不会卡UI界面
string times = sw.ElapsedMilliseconds.ToString();
MessageBox.Show("点按钮到我弹出来总共用了"+times+"毫秒证明异步调用不会卡到主线程");
} /// <summary>
/// 这是回调函数
/// </summary>
/// <param name="iar"></param>
public void ImproveTable(IAsyncResult iar)
{
int i = ;
if(iar!=null)
{
AsyncResult ar = iar as AsyncResult;
Func<int, DataTable> func = ar.AsyncDelegate as Func<int, DataTable>;
dtInput = func.EndInvoke(iar); DataTable dtCopy = dtInput.Copy();
dtOutput = dtInput.Clone(); //防止跨线程访问控件,利用lambda表达式,也可以直接定义一个委托实例去完成他
if (progressBar.InvokeRequired)
{
progressBar.Invoke(new Action(() => { progressBar.Maximum = dtCopy.Rows.Count; }));
}
else
{
progressBar.Maximum = dtCopy.Rows.Count;
} foreach (DataRow dr in dtCopy.Rows)
{
Thread.Sleep();
i++;
dtOutput.ImportRow(dr); //防止跨线程访问控件,
if (progressBar.InvokeRequired)
{
progressBar.Invoke(new Action(() => { progressBar.Value = i; }));
}
else
{
progressBar.Value = i;
} if (label1.InvokeRequired)
{
label1.Invoke(new Action(() => { label1.Text = ((i) != dtCopy.Rows.Count) ? "正在写入数据,写入行数" + i.ToString() + "..." : "数据写入完毕"; }));
}
else
{
label1.Text = ((i) != dtCopy.Rows.Count) ? "正在写入数据,写入行数" + i.ToString() + "..." : "数据写入完毕";
}
}
}
MessageBox.Show(String.Format("我复制到了{0}行数据,我睡了{1}秒",dtOutput.Rows.Count.ToString(),(i/).ToString()));
} /// <summary>
/// 生成数据的方法
/// </summary>
/// <param name="rows"></param>
/// <returns></returns>
public DataTable GetTableData(int rows)
{ string strColumns = "ID,Name,Gender";
string[] strCol = strColumns.Split(new char[] { ',' }); DataTable dt = new DataTable(); for (int i = ; i < strCol.Length; i++)
{
dt.Columns.Add(strCol[i]);
} //防止跨线程访问控件,
if(progressBar.InvokeRequired)
{
progressBar.Invoke(new Action(()=>{progressBar.Maximum=rows;}));
}
else
{
progressBar.Maximum = rows;
} Random r = new Random();
for (int i = ; i < rows; i++)
{
Thread.Sleep(); string id = r.Next(, ).ToString() + "ID";
string name = r.Next(, ).ToString() + "Name";
string gender = r.Next(, ).ToString() + "Gender"; dt.Rows.Add(new string[] { id, name, gender }); //防止跨线程访问控件,
if (progressBar.InvokeRequired)
{
progressBar.Invoke(new Action(() => { progressBar.Value = i+; }));
}
else
{
progressBar.Value = i+ ;
} if (label1.InvokeRequired)
{
label1.Invoke(new Action(() => { label1.Text = ((i+)!= rows) ? "正在读取数据读取行数" + i.ToString() + "..." : "数据读取完毕"; }));
}
else
{
label1.Text = ((i+) != rows) ? "正在读取数据读取行数" + i.ToString() + "..." : "数据读取完毕";
}
}
return dt;
}
}
}

关于代码的分析有时间再写。

代码里面主要用到了BeginInvoke  EndInvoke  关于 EndInvoke放在回调函数里面的代码是从博友那里学的。

关于用lambda表达式更新ProgressBar控件的方法也是从博友那里学的。

个人感觉写比冗余,等以后对.net 的熟练度提高以后看这些代码可能会感觉很小白。

如果有错误之处,请博友们指正,以防误导新人,同时也能提醒我。

winform 异步读取数据 小实例的更多相关文章

  1. corefx 源码学习:NetworkStream.ReadAsync 是如何从 Socket 异步读取数据的

    最近遇到 NetworkStream.ReadAsync 在 Linux 上高并发读取数据的问题,由此激发了阅读 corefx 中 System.Net.Sockets 实现源码(基于 corefx ...

  2. 项目中使用的ajax异步读取数据结构设计

    设计稍微复杂了一点,完成ajax读取功能涉及到了很多页面.虽然如此,但感觉比较灵活. 和传统方法唯一的区别在于多了一层数据容器控件,里面提供了显示数据的HTML元素及相应的JS方法. 这样数据控件指生 ...

  3. 【Python数据分析】从Web收集数据小实例

    最近在看<鲜活的数据:数据可视化指南>,学习一些数据可视化与数据分析的技术,本例是该书第一章的一个例子衍伸而来. 实例内容:从www.wunderground.com收集美国纽约州布法罗市 ...

  4. Ajax的post方法,模拟 从后台读取数据小demo

    $(document).ready(function() { //定义一个函数 function timer() { $.post("1.json", function(data, ...

  5. Highcharts使用简例 + 异步动态读取数据

    第一部分:在head之间加载两个JS库. <script src="html/js/jquery.js"></script> <script src= ...

  6. TensorFlowIO操作(二)----读取数据

    读取数据 小数量数据读取 这仅用于可以完全加载到存储器中的小的数据集有两种方法: 存储在常数中. 存储在变量中,初始化后,永远不要改变它的值. 使用常数更简单一些,但是会使用更多的内存,因为常数会内联 ...

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

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

  8. 循序渐进VBA EXCEL数据操作小实例

    1 向指定单元格区域内写入数据 Sub example1() ) arr() = Array("A", "B", "C", "D& ...

  9. android开启线程,异步处理数据实例

    package com.example.sywang2; import com.zds.os.R; import android.os.Bundle; import android.os.Handle ...

随机推荐

  1. java学习第17天(TreeSet HashSet)

    Set集合的特点(与ArrayList相比) 无序,唯一 主要学习它的两个子类 HashSet集合 A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode() ...

  2. js语言精粹读书笔记一

    一.语法 1.

  3. 第六百零六天 how can I 坚持(应该是六百零六天吧)

    找了个考研的借口,也是挺逗的,终于结束了,而且考的很渣. 最近发生了很多事,很快就要离开泛华了,放弃安逸,开始改变吧,其实感觉自己内心挺怂的,很怕改变,哎,这不像是有梦想,能成事的人应该有的. 还是想 ...

  4. [Nginx] 在Linux下的启动、停止和重加载

    Nginx的启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 其中-c参数指定配置文件路径.   Nginx的停止 ...

  5. GIS基本概念

    简介 WKT(Well-known text)是开放地理空间联盟OGC(Open GIS Consortium )制定的一种文本标记语言,用于表示矢量几何对象.空间参照系统及空间参照系统之间的转换. ...

  6. Hibernate和Struts2整合的增、删、改、查

    1. 新建一个Web项目,准备好jar包和配置文件. 2. web.xml文件中添加过滤器 <?xml version="1.0" encoding="UTF-8& ...

  7. SSRS动态设置文本框属性

    SSRS可以通过表达式动态设置文本框所有的属性,比如字体,字号,是否加粗,如下图所示: 汉字和数字英文字母占用的空间不一样,一个汉字占用两个数字和英文字母的空间,VB里有LENB取得字节数,这SSRS ...

  8. 智慧城市的【Auth】登录对象

    从Auth对象看前端:1.将与Auth对象相关的功能分离出来.所含的内容包括:[个人中心相关信息的显示,注册,登录,忘记密码,修改密码,个人信息修改]. 2.从“我的”页面开始,显示使用哪儿的数据,需 ...

  9. VFP 祺佑三层开发框架快速开发 演示DEMO

    祺佑三层开发框架快速开发  演示DEMO单表增删查改 链接:http://pan.baidu.com/s/1ntHXTXn 密码:wiwb 主从分离更新链接:http://pan.baidu.com/ ...

  10. Spring Web应用的最大瑕疵

    众所周知, 现在的Spring框架已经成为构建企业级Java应用事实上的标准了,众多的企业项目都构建在Spring项目及其子项目之上,特别是Java Web项目,很多都使用了Spring并且遵循着We ...