Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel催化剂开源第8波-VSTO开发之异步调用方法

Excel催化剂开源第8波-VSTO开发之异步调用方法

作者头像
Excel催化剂
发布于 2021-08-19 06:58:19
发布于 2021-08-19 06:58:19
69700
代码可运行
举报
文章被收录于专栏:Excel催化剂Excel催化剂
运行总次数:0
代码可运行

在VSTO开发过程中,因其和普通的Winform开发有点差别,具体细节笔者也说不清楚,大概是VSTO的插件是寄生在Excel中,不属于独立的进程之类的,其异步方法调用时,未能如Winform那样直接用await async异步方法就结束,仍需要再作简单的处理。

使用场景

在Excel上直接使用异步方法,貌似有上述提及的问题,不像Winform程序那样,需要Excel上调出窗体,再从窗体上作异步方法的操作,直接调用的话,遇到用户用键盘、鼠标交互Excel操作会报错。

Excel催化剂中有些操作与外部资源交互特别是外部网络访问时,若不使用异步方法,将会卡界面,用户感觉死机了一样。

使用异步方法后,可以有一些状态信息反馈给用户知道程序还在运行,是十分有必要的。

以下举例Excel催化剂批量下载文件的功能。

先按钮打开一个窗体,具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private void btnBatchDownLoadFile_Click(object sender, RibbonControlEventArgs e)
        {
            try
            {
                var result = MessageBox.Show(text: "是否需要在目标内容区域上生成超链接",
                    caption: "生成超链接确认",
                    buttons: MessageBoxButtons.YesNo);
                FormDownLoadFile form = new FormDownLoadFile();
                if (result == DialogResult.Yes)
                {
                    form.IsCreateHyperLink = true;

                }
                else
                {
                    form.IsCreateHyperLink = false;
                }

                form.Show();
            }
            catch (Exception ex)
            {
                Common.OutMsgError(ex);
            }
        }

批量下载文件界面

窗体中供用户配置一些信息后,即可开始下载文件,用户点击下载后运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private async void btnOK_Click(object sender, EventArgs e)
        {
            var markColor = Utilities.RangeUtility.GetMarkColorToDstRange(srcDataValues);
            int totalNum = srcDataValues.Count();
            int iLoop = 0;

            int rowOffset = int.Parse(this.cmbRowOffset.Text);
            int colOffset = int.Parse(this.cmbColOffset.Text);

            foreach (var item in srcDataValues)
            {
                iLoop++;
                string srcFilePath = item.Value2.ToString();

                string dstFilePath;
                Excel.Range dstItemRange = item.Offset[rowOffset, colOffset];
                if (dstItemRange.Value2 != null)
                {
                    dstFilePath = dstItemRange.Value2.ToString();
                    //没有后缀名时,标红颜色返回让用户自行检查
                    if (string.IsNullOrEmpty(Path.GetExtension(dstFilePath)))
                    {
                        item.Interior.Color = ColorTranslator.ToOle(markColor);
                        dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor);
                    }
                    else
                    {
                        WebClientEx webClient = new WebClientEx(3000);
                        Uri uri = new Uri(srcFilePath);
                        await webClient.DownloadFileTaskAsync(uri, dstFilePath);

                        //线程间操作无效: 从不是创建控件的线程访问它。 处理方法
                        Action<int, int, string> action = (i, n, s) =>
                            {
                                this.lblDownLoadInfo.Text = $"正在下载的是第【{i}】/【{n}】个文件\r\n文件名为:{s}";

                            };

                        Invoke(action,iLoop, totalNum, dstFilePath);

                        if (this.IsCreateHyperLink)
                        {
                            dstItemRange.Hyperlinks.Add(Anchor: dstItemRange, Address: dstFilePath, TextToDisplay: dstFilePath);
                        }


                    }

                }
                else//当目标单元格没有值时,标红颜色返回让用户自行检查
                {
                    item.Interior.Color = ColorTranslator.ToOle(markColor);
                    dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor);
                }

            }
            MessageBox.Show("下载完成!");

            Action actionColseForm = () => { this.Close(); };
            Invoke(actionColseForm);

        }

以上的关键代码关键之处有 用webClient库来下载,普通下载可满足,重写了它的超时时间 用await 关键字实现异步方法下载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        WebClientEx webClient = new WebClientEx(3000);
                        Uri uri = new Uri(srcFilePath);
                        await webClient.DownloadFileTaskAsync(uri, dstFilePath);

若代码需要重新访问窗体控件,需要用Action委托来处理下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        //线程间操作无效: 从不是创建控件的线程访问它。 处理方法
                        Action<int, int, string> action = (i, n, s) =>
                            {
                                this.lblDownLoadInfo.Text = $"正在下载的是第【{i}】/【{n}】个文件\r\n文件名为:{s}";

                            };

同样地下载结束后,关闭窗体,也需要重新用委托的方式来关闭。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Action actionColseForm = () => { this.Close(); };
            Invoke(actionColseForm);

结语

异步方法调用这东西,笔者也是新手,里面的原理也不甚完全知晓,也只是百度回来的代码能够运行起来的水平。但此篇代码还是可以给大家带来一些实质性的帮助,需要使用时,得胜一下代码即可。

因为VSTO的特殊性,可能这些问题,在专业程序猿群体中,不会遇到,但在VSTO开发群体中,这里的确是个大坑,希望给大家填补此坑后,大家可以更顺畅地写出更好的代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel催化剂开源第41波-网络采集类库及工具分享
在.Net4.0的框架上,只能用这个类库,在更高的框架.Net 4.5中,可以用HttpClient,比HttpRequest更高级的更易使用。
Excel催化剂
2021/08/19
1.2K0
Excel催化剂开源第20波-条件格式版聚光灯功能,行列标示方便阅读
Excel聚光灯功能,辅助数据查看,选择区域下的高亮显示所在行列位置,此功能已被广大Excel开发者研究得十分透彻,各种版本的聚光灯流转在网络里,同样地也是一大堆的VBA代码,难找.Net的现成代码,且大部分代码两级分化的入门级和走火入魔级。
Excel催化剂
2021/08/19
4870
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
此篇对应的Excel催化剂功能实现:第98波-零代码零距离轻松接触并拥有金融大数据 - 简书 https://www.jianshu.com/p/3cd41a483448
Excel催化剂
2021/08/19
5490
Excel催化剂开源第28波-调用Google规划求解库
在Excel催化剂的自定义函数中,有规划求解的函数,用于在一些凑数的场景,某财务工作网友向我提出的需求,例如用于凑发票额使用。
Excel催化剂
2021/08/19
3960
Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单
在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA、ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体控件一样,即可完成Ribbon功能区的开发,开发效率极高。
Excel催化剂
2021/08/19
1.6K0
Excel催化剂开源第25波-Excel调用百度AI,返回AI结果
在专业程序猿世界中,调用现成的WebAPI接口,实现一些别人提供的能力,是很常见的事情,其实在VBA开发者中,也不乏有这样的应用,例如调用某个网页API,返回一个二维码,实现二维码生成功能(在.Net中,直接有现成的这些轮子,无需调用网页,直接本地离线即可生成)。
Excel催化剂
2021/08/19
6320
Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑
Excel催化剂内部大量使用了DataGridView,这其中有一些小坑,花了力气才解决的,在此给广大开发者作简单分享。
Excel催化剂
2021/08/19
1.3K0
异步编程 In .NET
概述   在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试。今天我们再来回答一下这个问题,同时我们会做一个async和await在WinForm中的尝试,并且对比在4.5之前的异步编程模式APM/EAP和async/await的区别,最后我们还会探讨在不同线程之间交互的问题。   IIS存在着处理能力的问题,但是WinForm却是UI响应的问题,并且WinForm的UI线程至始至终都是同一个,所以两者之
用户1153966
2018/03/14
1.3K0
异步编程 In .NET
.Net异步编程详解入门
  今天周五,早上起床晚了。赶着挤公交上班。但是目前眼前有这么几件事情。刷牙洗脸、泡牛奶、煎蛋。在同步编程眼中。先刷牙洗脸,然后烧水泡牛奶。再煎蛋,最后喝牛奶吃蛋。毫无疑问,在时间紧促的当下。它完了,稳的迟到、半天工资没了。那么异步编程眼中,或许还有一丝解救的希望。先烧水,同时刷牙洗脸。然后泡牛奶,等牛奶不那么烫的时候煎个蛋。最后喝牛奶吃蛋。也许还能不迟到。在本篇文章中将围绕这个事例讲解异步编程。
小世界的野孩子
2019/09/11
7120
.Net异步编程详解入门
全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语
当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一种完全不同的编程思想,对于习惯了同步编程的开发者来说,在开发过程中难度更大,可控性不强是它的特点。 在.NET Framework5.0种,微软为我们系统了新的语言特性,让我们使用异步编程就像使用同步编程一样相近和简单,本文中将会解释以前版本的Framework中基于回调道德异步编程模型的一些限制以及新型的AP
小白哥哥
2018/03/07
2.4K0
全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语
Excel催化剂开源第12波-VSTO开发遍历功能区所有菜单按钮及自定义函数清单
在插件开发过程中,随着功能越来越多,用户找寻功能入口将变得越来越困难,在Excel催化剂 ,将采用遍历所有功能的方式,让用户可以轻松使用简单的查找功能找到想要功能所在位置,查找的范围有:功能按钮的显示名称、功能说明等。
Excel催化剂
2021/08/19
9480
Task及Mvc的异步控制器 使用探索
微软的Task已经出来很久了,一直没有去研究,以为就是和Thread差不多的东西。直到最近看到了Task的使用介绍,发现比Thread的语法要精炼多了,于是便在项目中用上了。
蓝夏
2022/03/10
6790
Task及Mvc的异步控制器 使用探索
Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
此篇对应功能实现出自:第3波-与PowerbiDesktop互通互联(Excel透视表连接PowerbiDesktop数据模型)https://www.jianshu.com/p/e05460ad407d
Excel催化剂
2021/08/19
6430
Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable
在Excel开发过程中,大部分时候是和Range单元格区域打交道,在VBA开发中,大家都知道的一点是,不能动不动就去遍历所有单元格,那性能是非常糟糕的,很多时候,是需要把整个单元格区域装入数组中再作处理的。
Excel催化剂
2021/08/19
1.7K0
C# 学习笔记(18)—— 异步编程
在平时的开发过程中,经常会遇到下载文件、加载资源一类的操作,它们都需要耗费一定的时间才能完成。如果这些程序的代码采用同步方式来实现,将严重影响程序的可操作性,因为在文件下载或资源加载的过程中,我们什么都不能做,只能傻傻地等待,也无法获悉执行进度。为了解决这样地问题,异步编程就孕育而生了
Karl Du
2023/10/20
3460
Excel催化剂开源第29波-在Winform上使用富文本编辑器控件
富文本编辑器,一般都是BS架构专利一般,好像百度有一个开源的比较出名,但无奈这些都只能用在JS上,在BS网页端开发上使用。像Winform开发的VSTO,只能羡慕的份。和一般Winform上用的RichText控件,别人BS的富文本编辑器就强大得多。
Excel催化剂
2021/08/19
1.1K0
Excel催化剂开源第10波-VSTO开发之用户配置数据与工作薄文件一同存储
在传统的VBA开发中,若是用的是普通加载项方法,是可以存储数据在xlam上的,若用的是Com加载项方法同时是Addins程序级别的项目开发的,配置文件没法保存到工作薄中,一般另外用配置文件来存放供调用。
Excel催化剂
2021/08/19
1.4K0
Excel催化剂开源第9波-VSTO开发图片插入功能,图片带事件
图片插入功能,这个是Excel插件的一大刚需,但目前在VBA接口里开发,如果用Shapes.AddPicture方法插入的图片,没法对其添加事件,且图片插入后需等比例调整纵横比例特别麻烦,特别是对于插入的多个图片非统一的纵横尺寸比时。
Excel催化剂
2021/08/19
1.5K0
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
在Excel催化剂的几大辅助录入功能中(数据验证保护、数据多级联动输入、关键词模糊智能匹配输入)中,用了一些customxmlPart技术来存储配置信息,同时在关键词模糊智能匹配输入中,用了一个VSTO开发才能满足的自定义控件技术,很值得启发,拿出来给大家作一分享。
Excel催化剂
2021/08/19
1.5K0
Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息
VSTO插件开发完成后,鉴于现在WPS用户也不少,很多时候用户没办法用OFFICE软件,只能在WPS环境下办公,VSTO开发的插件,只需增加一句注册表信息,即可让WPS识别到并调用VSTO开发的功能,可能部分功能让WPS使用要考虑WPS是否有相应的API接口,这是后话,本帖给大家粘出代码及程序,让用户双击即可完成,exe封装,无需给用户注册表文件让用户畏惧或其他安全软件报警。
Excel催化剂
2021/08/19
1.5K0
推荐阅读
Excel催化剂开源第41波-网络采集类库及工具分享
1.2K0
Excel催化剂开源第20波-条件格式版聚光灯功能,行列标示方便阅读
4870
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
5490
Excel催化剂开源第28波-调用Google规划求解库
3960
Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单
1.6K0
Excel催化剂开源第25波-Excel调用百度AI,返回AI结果
6320
Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑
1.3K0
异步编程 In .NET
1.3K0
.Net异步编程详解入门
7120
全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语
2.4K0
Excel催化剂开源第12波-VSTO开发遍历功能区所有菜单按钮及自定义函数清单
9480
Task及Mvc的异步控制器 使用探索
6790
Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
6430
Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable
1.7K0
C# 学习笔记(18)—— 异步编程
3460
Excel催化剂开源第29波-在Winform上使用富文本编辑器控件
1.1K0
Excel催化剂开源第10波-VSTO开发之用户配置数据与工作薄文件一同存储
1.4K0
Excel催化剂开源第9波-VSTO开发图片插入功能,图片带事件
1.5K0
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
1.5K0
Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息
1.5K0
相关推荐
Excel催化剂开源第41波-网络采集类库及工具分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验