惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
The GitHub Blog
The GitHub Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
博客园_首页
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
The Cloudflare Blog

博客园 - 云起

ArcGISPro SDK Addin打包机制 一次 ArcGISPro Addin项本地化的排查实录 记一次arm机器装系统的经历 记一次vs中无法找到win sdk的问题 arcpy运行时,报错产品许可尚未初始化 Visual Studio 2022生成解决方案代码图报错“无法连接到指定的数据库” win10下定制文件夹 excel中,根据文件名查询文件路径 Compress-Archive压缩zip包的小瑕疵 Pro更新字段别名,重载数据后失效 在多个office文档内替换关键字 git日志分组 xlst处理时命名空间带来的小坑 更新压缩流 使用excel生成简单的日历 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常 使用C#获取文件详情 Pro更改启动界面 使用AES加密时,结果不一样 命令行程序读取注册表失败的分析 pg_index
ArcGISPro SDK 3.1版本中使用QueuedTask的小问题
云起 · 2025-08-01 · via 博客园 - 云起

同事在使用3.1版本的时候,使用如下代码

        private async Task<string> GetMessage(string msg)
        {
            await Task.Delay(10000);
            return msg;
        }
        async Task DoSomething()
        {
            ProgressorSource progressor = new ProgressorSource("Progressor");
            Debug.WriteLine("start");
            await QueuedTask.Run(async () =>
            {
                string msg = await GetMessage("hello1");
                Debug.WriteLine(msg);
            }, progressor.Progressor);
        }

本意是希望耗时过程处理完,再关闭进度条,但是进度条会先于耗时方法关闭。

我是用的是3.3版本,没有这个问题。究其原因,是QueuedTask.Run的实现进行了优化,估计esri发现了这个问题,所以做了调整,修复了这个问题。

3.1的实现中,Progressor的注册,是使用的QueuedTask.Run传入的任务对象(我们给他起个代号,taskA)的id,后续关闭进度条的时候也是用的这个id。所以如果taskA内没有其他异步方法,则没有问题。但如果taskA内又通过await起了异步,调度器大概率是不会共用Task对象的。状态机跳转的时候,taskA就有result了,之后就会关闭进度条了,而这时候没有保证内部的异步都执行完。

而优化后的实现,采用了基于调度器分配序列号的方式,并使用ContinueWith创建新任务来关闭进度条。

如果使用3.1 sdk的话,推荐使用同步方式来执行。

        async Task DoSomething()
        {
            ProgressorSource progressor = new ProgressorSource("Progressor");
            Debug.WriteLine("start");
            await QueuedTask.Run(() =>
            {
                Task.Run(async () =>
                {
                    string msg = await GetMessage("hello1");
                    Debug.WriteLine(msg);
                }).Wait();
            }, progressor.Progressor);
        }