Tengo una configuración en la que se agregarán potencialmente miles de elementos (supongamos 3000-5000) a un ObservableCollection
que está vinculado a alguna interfaz visual. Actualmente, el proceso de agregarlos es bastante lento (aproximadamente 4 segundos/1000 elementos) y, por supuesto, la GUI no responde durante ese tiempo. ¿Cuál es un buen método para mover muchos elementos a la vez en una colección sin preocuparse por el bloqueo del sistema? Miré DispatcherTimer
pero no estoy seguro si proporcionará todo lo que necesito.Cómo agregar miles de elementos a una colección encuadernada sin bloquear GUI
Otra pregunta: ¿hay algo que pueda hacer para acelerar la creación de estos objetos para que no tarden tanto en agregarlos a la colección? Actualmente los uso así: Collection.Add(new Item(<params>))
¿Generaría los elementos de antemano, probablemente en un hilo de fondo, disminuiría el tiempo que lleva agregarlos en una cantidad notable?
Editar: La virtualización no es posible. Los requisitos especifican un vistazo WrapPanel
, por lo que la pantalla es en realidad un ListBox
que tiene una plantilla de ItemsPanel
Edit2: De acuerdo con el cronómetro, el cuello de botella es en realidad poniendo artículos en mi ObservableCollection
. Voy a tratar de cambiar ese tipo de colección y hacer mi propia notificación para ver si eso lo acelera sustancialmente.
Edit3: Así que la respuesta está en un solo lugar - He resuelto este problema (con la ayuda de abajo) creando una clase que hereda de ObservableCollection
. Esta clase hizo dos cosas: exponer un método para agregar colecciones a la vez, y agregó la posibilidad de suprimir el evento CollectionChanged
. Con estos cambios, el tiempo que lleva agregar 3000 elementos es aproximadamente .4 segundos (97% de mejora). This enlace detalla la implementación de estos cambios.
Hay algunas cosas que podrías hacer. Uno podría ser crear todos los objetos antes de crear su ObservableCollection, de ese modo, una vez que lo haya creado, puede inicializarlo con la colección de elementos que ya tiene. Otra opción es usar [ReactiveExtensions] (http://msdn.microsoft.com/en-us/data/gg577609.aspx) que le permitirá "observar" su fuente de datos y agregar elementos a su ObservableCollection de forma asincrónica. – Thelonias
Además, tiene que ser la creación de su artículo que es el sumidero del tiempo, no el "agregar". Entonces, ¿no puedes empujar la creación a otro hilo, coleccionarlos en alguna colección intermedia y, una vez que se hayan creado, agregarlos al ObservableCollection en el hilo de la GUI? – Thelonias
@Ryan Estos son algunos puntos buenos. Moveré la creación al fondo e informaré mi velocidad entonces. – steveg89