前言

先说明一下,本人不太做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. C++类实现AVL树

    二叉查找树是个好东西,他让查找,插入,删除,这些常用操作变得高效,但是,他是存在问题的,那就是,在坏的输入序列下,树会退化成链表,这就很尴尬了,于是为了避免这种情况的发生,我们需要一种数据结构,可以自 ...

  2. 5个数求最值—南阳acm

    问题描述  设计一个从5个整数中取最小数和最大数的程序   输入       输入只有一组测试数据,为五个不大于1万的正整数 输出      输出两个数,第一个为这五个数中的最小值,第二个为这五个数中 ...

  3. patch与diff的恩怨

    一.概述 diff和patch是一对相辅相成的工具,在数学上来说,diff类似于对两个集合的差运算,patch类似于对两个集合的和运算.diff比较两个文件或文件集合的差异,并记录下来,生成一个dif ...

  4. MediaInfo源代码分析 2:API函数

    本文主要分析MediaInfo的API函数.它的API函数位于MediaInfo.h文件中的一个叫做MediaInfo的类中. 该类如下所示,部分重要的方法已经加上了注释: //MediaInfo类 ...

  5. sql语句书写升降序

    1, desc:降序,明天今天昨天,zyx...cba,.....321 sql语句:select * from SC_BackDiggingInfo where WriteDate<='201 ...

  6. 如何引入一个Schema 文件

    Schema(掌握如何引入一个schema文件)    * 名称空间 : 指的是一个环境,所用的标签来自于哪个环境定义的.    * 掌握引用schema文件:             xml中引入s ...

  7. JavaScript- 省市联动代码

    以下是JS省市联动菜单代码: 代码一: <html> <head> <title></title> <script language=" ...

  8. hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜

    近期在云服务器上新部署了一个项目 硬件配置 CPU: 2核    内存: 4096 MB (I/O优化) 开始是调试测试在用 没发觉,今天我看了下监控 cpu使用率达到了60-70% 而且一直持续 我 ...

  9. 我的第一个phonegap开发WebApp的demo 怎么搭建安卓开发环境以及安装phonegap

    一.先来张图,赏心悦目观赏一下,哈 . 这个就是使用phonegap框架搭建起来的,运行在安卓环境上的第一个demo. 安卓的开发环境,大家都会搭建了,所以不赘述.讲一下,安装phonegap的步骤. ...

  10. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...