Xamarin.Forms Dispatcher.BeginInvokeOnMainThread 导致 iOS 死锁

Xamarin.Forms Dispatcher.BeginInvokeOnMainThread causing deadlock on iOS

我的主页上有一个名为 indicator 的 activity 指示器。 我想为它设置动画,以便它循环显示每种颜色。为此,我正在使用这种方法:

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 上,指示器会静止不动,直到彩虹任务完成,然后它开始旋转。

我已经尝试了 Device.InvokeOnMainThreadAsync(),结果相同

我已经在 iOS 本机开发工具 (Xcode) 中使用 Objective-C[=22= 进行了测试] 每次变色小于1秒,与Xamarin Forms出现同样的现象。然后我觉得ActivityIndicator在iOS不支持每次不到一秒换色。

因此,使其工作的简单方法是每隔一秒修改一次代码以更改颜色:

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

如果 iOS 中需要不到一秒的时间来更改颜色,您可以尝试使用自定义渲染器通过使用 Navtive mtethod CADisplayLink or DispatchSource.Timer[=22 来自定义 ActivityIndicator =].