前言

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

BeginInvoke产生的原因

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

美中不足

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

BeginInvoke出来了

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

下面是一个简单的例子:

  1. /// <summary>
  2. /// 批量添加
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void button1_Click(object sender, EventArgs e)
  7. {
  8. message.Text = "程序正在处理...";
  9.  
  10. var beginInvokeThread = new Thread(() =>
  11. {
  12. var result = userBll.GeneratorUserData(dateTimePicker1.Value);//耗时工作
  13. #region BeginInvoke
  14. Func<ReturnMsg, string> funDelegate = new Func<ReturnMsg, string>(InvodeGeneratorUserData);
  15. IAsyncResult aResult = this.BeginInvoke(funDelegate, result);
  16. aResult.AsyncWaitHandle.WaitOne(-);
  17. if (aResult.IsCompleted)//这里不可以访问主线程的信息
  18. MessageBox.Show(this.EndInvoke(aResult).ToString());
  19. #endregion
  20. });
  21. beginInvokeThread.Start();
  22. }

委托方法如下:

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

下面是运行的效果图:

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. 小Q书桌的下载、安装和使用

    最近,无意之间,在某大牛电脑里,使用到了这款软件.感谢! 确实,挺实用和方便的,强烈推荐!!! 1.  下载 http://qdesk.qq.com/ 2.  安装 3.  使用 多么方便啊!

  2. 关于附件控件隐藏后,在IE下不能上传,报“拒绝访问”

    报错时的使用: @Html.TextBoxFor(m => m.FileName, new { style = "width:457px;", @readonly = &qu ...

  3. 运用HBuilder上传到GitHub

    Hbuilder安装github插件 如图所示: 一.打开自己GitHub,新建一个"库" 2.设置自己项目名和简介 3.建完后,就会显示GitHub要上传路径 4.打开" ...

  4. 抓取用户openid

    获取用户微信openid用户无感知情况下 传参为 appid appsecret 当前网址 session_name名称 <?php //获取微信的openid function get_wx_ ...

  5. 在网上浏览.NET的所有代码,并且让你的Visual Studio的go to definition(F12)指向在线代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在网上浏览.NET的所有代码,并且让你的Visual Studio的go to definition(F ...

  6. Sysinternals Suite实用程序工具包

    Sysinternals Suite是微软出品的一套集成数十个绿色软件的实用程序工具包.就在2014年1月29日(官方日期),迎来了2014新版本 AccessChk为了确保创建安全的环境,Windo ...

  7. 标准库function类型的使用

    14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> ...

  8. CentOS7上Nginx的使用

    Nginx 的启动 指定配置文件的方式启动nginx # nginx -c /etc/nginx/nginx.conf 对于yum安装的nginx,使用systemctl命令启动 # systemct ...

  9. 解决iScroll中事件点击一次却触发两次的问题

    var t1=null;//全局 function myClick() { if (t1 == null){ t1 = new Date().getTime(); }else{ var t2 = ne ...

  10. css制作导航栏的上下三角

    1)先完成一个导航条 <style type="text/css"> .nav-ul{ list-style: none; } .nav-ul li{ width: 1 ...