c# mvvm task-parallel-library portable-class-library xamarin.forms

c# - Dispara una acción para comenzar después de X milisegundos



mvvm task-parallel-library (3)

Como dijiste, esto se puede lograr de una manera muy limpia usando Tasks y programación asincrónica.

Deseará leer sobre esto: http://msdn.microsoft.com/en-us/library/hh191443.aspx

Aquí hay un ejemplo:

public async Task DelayActionAsync(int delay, Action action) { await Task.Delay(delay); action(); }

Estoy desarrollando una aplicación móvil Xamarin Forms, que tiene una página que contiene SearchBar, ListView y control de mapa. La vista de lista contiene una lista de direcciones, que se reflejan como pins en el mapa.

A medida que el usuario escribe en SearchBar, ListView se actualiza automáticamente (a través del enlace ViewModel). El método ViewModel que filtra el origen de datos para la lista se parece a esto ...

void FilterList() { listDataSource = new ObservableCollection<location>( locationData.Where(l => l.Address.Contains(searchBar.Text)) ); // ***** Now, update the map pins using the data in listDataSource }

Quiero actualizar el mapa a medida que se filtra el ListView, pero no en cada pulsación de tecla, ya que podría suceder varias veces por segundo. Básicamente, quiero una "pausa continua" en cada evento FilterList antes de que se actualice el mapa. En pseudo-código ...

// ***** Now, update the map pins using the data in listDataSource if (a previously-requested map update is pending) { // Cancel the pending map update request } // Request a new map update in 1000ms using [listDataSource]

Es posible hacer esto usando la clase Cronómetro , que está disponible en Bibliotecas de clases portátiles, pero sospecho que hay una manera más limpia / mejor de lograr esto usando Tareas .

¿Alguien puede sugerir una forma compatible con PCL "más inteligente" para hacer esto?


Esto es lo que hice y funciona en las aplicaciones de mi formulario Xamarin.

public string Search { get { return _search; } set { if (_search == value) return; _search = value; triggerSearch = false; Task.Run(async () => { string searchText = _search; await Task.Delay(2000); if (_search == searchText) { await ActionToFilter(); } }); } }

Tengo esta Propiedad de ''Búsqueda'' vinculada a mi campo de Entrada. Cada vez que el usuario filtra algo, el código espera durante 1 segundo y luego compara el nuevo campo de texto con el campo que era antes de 1 segundo antes. Asumir que la cadena es igual implica que el usuario ha dejado de ingresar el texto y ahora se puede activar el código para filtrar.


puedes probar :

await Task.Delay(2000);