ArcGISPro SDK 3.1版本中使用QueuedTask的小问题

Posted on 2025-08-01 18:16  云起  阅读(13)  评论(0)    收藏  举报

同事在使用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);
        }

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3