前言

先说明一下,本人不太做winform的项目,工作10年以来,一直奋斗在webform的舞台上,今天有机会也接触了一下winform,下面对工作中用到的BeginInvoke方法作一下说明,和大家也一起学习一下,呵呵。

BeginInvoke产生的原因

首先一个winform程序运行后,会有一个主线程(UI),我们看到的页面上的元素,表单,列表框等等都运行在主线程上的,主线程一阻塞,这些东西就都点不了了,呵呵,所以,在我们运行一些耗时的功能时,通常会开启一个新的线程去干这事,这是和乎情理的,想像一下,当我们在新线程里工作时,主线程不被阻塞(不假死),用户体验是多么好呀,当在新线程里干完事后,把消息返回给主线程,就OK了!

美中不足

想的挺好,可惜在新线程里,干完事后,运行程序,在为主窗体元素赋值时,出错了,说是不能访问主线程的元素,这到是正常的,线程与线程本来就是独立的,所以只能找其它方法了(可以使用这个方法解决上面的问题,但不推荐:  Control.CheckForIllegalCrossThreadCalls = false;)

BeginInvoke出来了

微软为了解决上面的线程之间信息相互访问的问题,封装了BeginInvoke方法,它允许我们传入一个委托,在委托方法中干这件时,这时你的主线程元素是可以被访问的,当处理完成后,可以操纵主线程的元素,即主线程元素重新赋值。

下面是一个简单的例子:

        /// <summary>
/// 批量添加
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
message.Text = "程序正在处理..."; var beginInvokeThread = new Thread(() =>
{
var result = userBll.GeneratorUserData(dateTimePicker1.Value);//耗时工作
#region BeginInvoke
Func<ReturnMsg, string> funDelegate = new Func<ReturnMsg, string>(InvodeGeneratorUserData);
IAsyncResult aResult = this.BeginInvoke(funDelegate, result);
aResult.AsyncWaitHandle.WaitOne(-);
if (aResult.IsCompleted)//这里不可以访问主线程的信息
MessageBox.Show(this.EndInvoke(aResult).ToString());
#endregion
});
beginInvokeThread.Start();
}

委托方法如下:

        /// <summary>
/// 一个委托,把消息返回并填充到主窗体(主线程)的页面元素上
/// </summary>
/// <param name="month"></param>
/// <returns></returns>
private string InvodeGeneratorUserData(ReturnMsg res)
{
this.message.Text = res.GetDescription();//这里可以访问主线程的信息
return res.GetDescription();
}

下面是运行的效果图:

aaarticlea/png;base64,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" alt="" />

我也来玩玩WinForm~BeginInvoke让用户体验更好!的更多相关文章

  1. WTF Forms – 使用 CSS 实现用户体验更好的表单

    WTF forms 借助 CSS 提供友好的 HTML 表单控件,专为 IE9+ 以及最新的 Chrome.Safari 和 Firefox 浏览器.以文件输入控件的改进,使用 label 包裹在 i ...

  2. Django Web开发【6】使用Ajax增强用户体验

    Ajax及其优点 Ajax实际上就是指异步Javascript与XML,它包含以下技术: HTML与CSS Javascript XMLHttpRequest XML Ajax技术让客户端与服务器实现 ...

  3. JavaScript脚本放在哪里用户体验好

    javascript代码写在<head>里面: 由于这时候网页主体(body)还未加载,所以这里适合放一些不是立即执行的自定义函数,立即执行的语句则很可能会出错(视浏览器而定) javas ...

  4. Web开发中设置快捷键来增强用户体验

    从事对日外包一年多以来,发现日本的无论是WinForm项目还是Web项目都注重快捷键的使用,日本人操作的时候都喜欢用键盘而不是用鼠标去点,用他们的话来说"键盘永远比鼠标来的快",所 ...

  5. vs2010 使用SignalR 提高B2C商城用户体验(三)

    vs2010 使用SignalR 提高B2C商城用户体验(三) 上一章节,我们的web即时通讯已经可以实现跨域了,但针对我们的需求,还希望,一些客户端程序可以和我们的web用户,在线聊天,所以到Sig ...

  6. 提升用户体验的最佳免费 jQuery 表单插件

    网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...

  7. CSS3新特性应用之用户体验

    一.光标 新增加not-allowed光标,不允许访问 隐藏光标,在触模应用上很有用,css2.1需要一个透明的图片来实现,而css3直接用cursor:none即可. 完整代码: curosr: u ...

  8. Apple、Google、Microsoft的用户体验设计原则

    轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...

  9. Android开发学习之路-提升用户体验小技巧

    记得之前看谷歌的一个视频提到这个用户体验的问题,今天想起来了就写了个Demo来记录下. 当一个事件发生之后,用户需要一段时间才能知道结果,那么这段时间究竟应该让用户干什么?这个问题很常见,比如我们的软 ...

随机推荐

  1. JAVA网络编程基础知识

    网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协 ...

  2. Twitter 工程师谈 JVM 调优

    一. 调优需要关注的几个方面 内存调优 CPU 使用调优 锁竞争调优 I/O 调优 二. Twitter 最大的敌人:延迟 导致延迟的几个原因? 最大影响因素是 GC 其他的有:锁和线程调度.I/O. ...

  3. Day 1 @ RSA Conference Asia Pacific & Japan 2016

    # 国内出发 早上8:45的航班,首次从深圳机场乘坐国际航班(先前去日本.欧洲都从香港走),就提前了3个小时出发. 乘taxi到机场30分钟不到,135元.到了T3 4号出发口,发现check-in的 ...

  4. jbpm6 开发环境搭建

     一.软件下载 1. eclipse       下载地址:http://www.eclipse.org/downloads/ 2.jbpm6.2 Installer       下载地址: ht ...

  5. 硝烟中的Scrum和XP-我们如何实施Scrum 15)多团队 Part 2/2 16)地理分散 17)检查列表 18)其他

    引入"团队领导"角色 假设有3个团队开发同一个产品 红色的P是PO, 黑色的S是SM, 蓝色是其他团队成员; 如何决定哪些人属于哪个团队? 怎么分配成员? 有人觉得让PO来做人员分 ...

  6. JSP内置对象整理(转)

    ① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...

  7. mybatis0203 一对一查询 resultMap实现

    resultType实现的时候先要确定po类(数据库类)满不满足要求,如果不满足就要自定义一个pojo类(工具类). resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将 ...

  8. [转] Tomcat 配置 SSL

    PS: keystore有自己的访问密码,这个保护层次要低一些,然后keystore里面存有自己的私钥,所以用户要破解的话,既要有keystore,又要有keystore的密码,p12是客户端keys ...

  9. Google Map API v2 步步为营(一) ----- 初见地图

    官方文档:https://developers.google.com/maps/documentation/android/start?hl=zh-CN 先谷歌后百度.使用google的api基本上按 ...

  10. C# 序列化和反序列

    1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Seri ...