前言

先说明一下,本人不太做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. HW4.31

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. UILable自适应frame

    UILabel *textlab = [[UILabel alloc]initWithFrame:CGRectMake(20, 10,ScrollView.frame.size.width - 40, ...

  3. Windows不能在本地计算机启动OracleDBConsoleorcl .错误代码2

    Windows 不能在 本地计算机 启动 OracleDBConsoleorcl.有关更多信息,查阅系统事件日志.如果这是非 Microsoft 服务,请与服务厂商联系,并参考特定服务错误代码 2. ...

  4. tomcat6~7~8用户设置及一个独立服务器上跑多个tomcat配置JVM设置优化亲测

    tomcat6管理用户 在tomcat `安装根目录`/conf/tomcat-users.xml

  5. poj 2406 Power Strings【最小循环节】

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 36926   Accepted: 15254 D ...

  6. Code Forces 711C Coloring Trees

    C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. CSS选择器详解(伪类) 转 http://blog.csdn.net/Panda_m/article/details/50084699

    CSS选择器详解 之 伪类 伪类对大小写不敏感 结构伪类选择器 结构伪类是CSS3新增的类型选择器,利用DOM树实现元素过滤,通过文档结构的相互关系来匹配元素,可以减少class和id属性的定义,使文 ...

  8. Android开发之50个常见实用技巧——活用布局

    第一章.活用布局 Hack1. 使用weight属性实现视图的居中显示  ①合用weightSum属性和layout-weight属性 解决问题,如:居中显示按钮,并占据父视图的50%: 代码如: & ...

  9. [C#] 常用工具类——系统日志类

    using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespa ...

  10. 仿path菜单button的实现

    path刚出来时.其菜单button也算是让大多数人感到了惊艳,如今看来事实上是非常easy的就是动画的结合. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...