同事在使用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);
}
浙公网安备 33010602011771号