Xamarin.Forms Dispatcher.BeginInvokeOnMainThread导致iOS上的死锁

问题描述 投票:0回答:1

我的页面上有一个活动指示器,称为indicator。我想对其进行动画处理,以使其遍历每种颜色。为此,我正在使用这种方法:

public static async Task ActivityIndicatorRainbow(ActivityIndicator indicator, int colorDelay)
        {
            for (double i = 0; i < 1; i += 0.01)
            {
                Color c = Color.FromHsla(i, 0.5, 0.5);

                indicator.Dispatcher.BeginInvokeOnMainThread(()=> indicator.Color = c);

                await Task.Delay(colorDelay);
            }
        }

并且在我的ButtonPressed方法中,我使用以下方法调用它:

activityIndicator.IsRunning = true;
await Task.Run(() => ActivityIndicatorRainbow(activityIndicator, 10));

在Android上运行正常,指示器在更改颜色时旋转。但是在iOS上,指标会保持不变,直到Rainbow Task完成,然后才开始旋转。

我已经尝试使用Device.InvokeOnMainThreadAsync()获得相同的结果

c# ios .net xamarin deadlock
1个回答
0
投票

我已经在iOS Native平台上通过使用Objective-C每隔不到1秒钟更改颜色的方式进行了测试,它与Xamarin Forms出现相同的现象。然后,我认为iOS中的ActivityIndicator每次少于一秒都不支持更改颜色。

因此,每1秒钟修改如下代码以更改颜色:

activityIndicator.IsRunning = true;
await Task.Run(() => ActivityIndicatorRainbow(activityIndicator, 1000));

如果需要不到一秒钟的时间在iOS中更改颜色,则可以尝试使用Navtive mtethod中的CADisplayLinkDispatchSource.Timer

© www.soinside.com 2019 - 2024. All rights reserved.