我也来玩玩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(-1);
                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();
        }

下面是运行的效果图:

本文转自博客园张占岭(仓储大叔)的博客,原文链接:我也来玩玩WinForm~BeginInvoke让用户体验更好!,如需转载请自行联系原博主。

目录
相关文章
|
19天前
|
测试技术 Python
App自动化测试中,如何更好地处理弹窗?
在App自动化测试中,处理弹窗异常是保证测试稳定性和可靠性的重要环节。当遇到广告弹窗、升级提示等不定时出现的UI元素时,可以采用黑名单处理方法,如上述Python代码示例,通过尝试点击黑名单中的元素来避免干扰。同时,利用异常处理装饰器可以增强函数功能,保持代码整洁,当异常发生时记录日志、截图并保存页面源代码,便于问题排查。这两种策略能有效提升测试的效率和质量。
7 0
|
5月前
|
前端开发 测试技术 UED
前端知识笔记(三十三)———浅谈用户体验测试的主要功能
前端知识笔记(三十三)———浅谈用户体验测试的主要功能
42 0
|
7月前
|
JSON IDE 开发工具
<4> :开发技巧/方法:
<4> :开发技巧/方法:
27 0
|
10月前
|
C# 计算机视觉 开发者
在Winform中一分钟入门使用好看性能还好的Blazor Hybrid
在Winform中一分钟入门使用好看性能还好的Blazor Hybrid
139 0
在Winform中一分钟入门使用好看性能还好的Blazor Hybrid
|
JSON 缓存 JavaScript
AT-UIの入手某东的UI框架
用Element-UI做了两个后台,时间长了有点视觉劳累,挑来挑去,入选了某东的AT-UI,搭建了一个雏形的后台骨架,下面记录一下使用方法(此时应附地址:官网传送门)。
549 0
|
前端开发 UED
悬赏任务源码,了解更多加载方式提升用户体验
悬赏任务源码,了解更多加载方式提升用户体验
|
C# 虚拟化 UED
细数改善WPF应用程序性能的10大方法
原文:细数改善WPF应用程序性能的10大方法       WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。
1143 0
|
安全 UED
陪玩平台源码具有哪些优点,开发怎样实现
陪玩平台源码不仅实现陪玩下单、多人聊天等功能,还实现了用户直播、礼物打赏、快速匹配等功能,丰富系统功能,满足用户更多需求。
|
XML Linux 数据格式
使用代理模式改善SAP UI5应用的图片加载体验
使用代理模式改善SAP UI5应用的图片加载体验
使用代理模式改善SAP UI5应用的图片加载体验
|
C# C++
WPF 卡顿调试经验
原文:WPF 卡顿调试经验 1. 问题 最近的一个项目,正常调试情况下,运行一切正常,但是有某个用户登录后,出现界面卡顿2-3mins后,才正常运行。 2.解决问题方法 (1)首先由于是必现问题,就想在vs的工作环境下调试一下,看看到底是什么地方比较慢,想法很理想,但是现实很残酷,没有找到问题所在。
1453 0