我也来玩玩WinForm~BeginInvoke让用户体验更好!
前言
先说明一下,本人不太做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让用户体验更好!的更多相关文章
- WTF Forms – 使用 CSS 实现用户体验更好的表单
WTF forms 借助 CSS 提供友好的 HTML 表单控件,专为 IE9+ 以及最新的 Chrome.Safari 和 Firefox 浏览器.以文件输入控件的改进,使用 label 包裹在 i ...
- Django Web开发【6】使用Ajax增强用户体验
Ajax及其优点 Ajax实际上就是指异步Javascript与XML,它包含以下技术: HTML与CSS Javascript XMLHttpRequest XML Ajax技术让客户端与服务器实现 ...
- JavaScript脚本放在哪里用户体验好
javascript代码写在<head>里面: 由于这时候网页主体(body)还未加载,所以这里适合放一些不是立即执行的自定义函数,立即执行的语句则很可能会出错(视浏览器而定) javas ...
- Web开发中设置快捷键来增强用户体验
从事对日外包一年多以来,发现日本的无论是WinForm项目还是Web项目都注重快捷键的使用,日本人操作的时候都喜欢用键盘而不是用鼠标去点,用他们的话来说"键盘永远比鼠标来的快",所 ...
- vs2010 使用SignalR 提高B2C商城用户体验(三)
vs2010 使用SignalR 提高B2C商城用户体验(三) 上一章节,我们的web即时通讯已经可以实现跨域了,但针对我们的需求,还希望,一些客户端程序可以和我们的web用户,在线聊天,所以到Sig ...
- 提升用户体验的最佳免费 jQuery 表单插件
网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...
- CSS3新特性应用之用户体验
一.光标 新增加not-allowed光标,不允许访问 隐藏光标,在触模应用上很有用,css2.1需要一个透明的图片来实现,而css3直接用cursor:none即可. 完整代码: curosr: u ...
- Apple、Google、Microsoft的用户体验设计原则
轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...
- Android开发学习之路-提升用户体验小技巧
记得之前看谷歌的一个视频提到这个用户体验的问题,今天想起来了就写了个Demo来记录下. 当一个事件发生之后,用户需要一段时间才能知道结果,那么这段时间究竟应该让用户干什么?这个问题很常见,比如我们的软 ...
随机推荐
- Java 字符转码之UTF-8转为GBK/GB2312
java跟python类似的做法,在java中字符串的编码是java修改过的一种Unicode编码,所以看到java中的字符串,心理要默念这个东西是java修改过的一种Unicode编码的编码. pa ...
- 获取toast值
/** * 获取Toast的String值 * @return */ public String getToast(int timeout){ TextView toastTextView = nul ...
- 会话数据的管理——Session
cookie的局限性: cookie只能存字符串类型.不能保存对象 只能存非中文 1个cookie的容量不超过4KB(如果要保存非字符串,超过4kb内容,只能使用session技术!!!) Sessi ...
- JAVA-应用easyui
easyui下载地址:http://www.jeasyui.com/index.php 现在还easyui之后将其解压,解压之后将文件夹中的文件除了demo文件夹之外的文件放入到Eclipse的web ...
- (转载)equals与==
引言:从一个朋友的blog转过来的,里面解决了两个困扰我很久的问题.很有久旱逢甘霖的感觉. 概述: A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型 ...
- Struts工作流程
Java Web 都是使用线程来处理用户的请求(request)的,一次请求对应一个处理线程.Struts 2会为每个处理线程分配一个Action对象, 将提交的参数注射到Action属性中,并调用A ...
- ubuntu文件管理常用命令 分类: linux ubuntu 学习笔记 2015-07-02 16:57 29人阅读 评论(0) 收藏
1.关闭防火墙:ufw disable 2.以.开头的表示隐藏文件 3..和..分别代表当前目录以及当前目录的父目录 4.显示当前用户所在目录pwd 5.touch创建空文件 6.mkdir创建新目录 ...
- 在Silverlight中使用async/await
现在 async/await 大行其道,确实,有了 async/await ,异步编程真是简单多了,个人觉得 async/await 的出现,给开发者还来的方便,绝不亚于当年 linq 的出现. 但要 ...
- CentOS7安装Puppet+GitLab+Bind
添加Puppet官方源 rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm 安装Puppet yum -y i ...
- Property工具类,Properties文件工具类,PropertiesUtils工具类
Property工具类,Properties文件工具类,PropertiesUtils工具类 >>>>>>>>>>>>>& ...