El método de Draw de Overridden de ViewRenderer bloquea la interfaz de usuario

Implemento un control Xamarin.Forms. El problema que experiancing actualmente es que un método Draw() de un renderizador personalizado bloquea la interfaz de usuario (al less para la plataforma iOS). He buscado en Google, pero sin éxito. ¿Es posible realizar el dibujo en segundo plano sin bloquear la interfaz de usuario?

Aquí está el código de un procesador simple para la plataforma iOS que demuestra el problema.

 public class MyCustomRenderer : ViewRenderer { protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); SetNeedsDisplay(); } public override void Draw(CoreGraphics.CGRect rect) { var myControl = (MyControl)this.Element; if (!myControl.IsRendenetworking) { using (var context = UIGraphics.GetCurrentContext()) { var token = CancellationToken.None; var task = Task.Factory.StartNew(() => TimeConsumingRendering(context, token), token); // task.Wait() blocks the UI but draws the desinetworking graphics. // When task.Wait() is commented out = the desinetworking graphics doesn't get drawn and it doesn't block the UI task.Wait(); } } } private void TimeConsumingRendering(CGContext context, CancellationToken token) { try { for (int i = 0; i <= 100; i++) { token.ThrowIfCancellationRequested(); var delay = Task.Delay(50); delay.Wait(); } context.ScaleCTM(1f, -1f); context.TranslateCTM(0, -Bounds.Height); context.SetTextDrawingMode(CGTextDrawingMode.FillStroke); context.SelectFont("Helvetica-Bold", 16f, CGTextEncoding.MacRoman); context.SetFillColor(new CoreGraphics.CGColor(1f, 0f, 0f)); context.ShowTextAtPoint(0, 0, "Finished"); } catch { } } } 

Parece que la única solución para eso es separar el dibujo y el dibujo que requieren mucho time en el control real.

La solucion es

  1. para generar una image en segundo plano (desencadenada por un evento). y solo que utilizarlo dentro del método Draw.
  2. para usar la image generada dentro del método de Draw anulado.

Al less me funciona.