c# - Cola de tareas para wp8?
windows-phone-7 windows-phone-8 (1)
Si usa async
/ await
, no hay necesidad de otro subproceso (ya que no tiene procesamiento vinculado a CPU).
En su caso, parece que solo necesita una cola de delegados asíncronos. El tipo natural de un delegado asíncrono es Func<Task>
(sin un valor de retorno) o Func<Task<T>>
(con un valor de retorno). Este pequeño consejo desafortunadamente no es muy conocido en este momento.
Por lo tanto, declare una cola de delegados asincrónicos:
private readonly Queue<Func<Task>> queue = new Queue<Func<Task>>();
Luego puede tener una única tarea de "nivel superior" que solo (asincrónicamente) procese la cola:
private Task queueProcessor;
queueProcessor
puede ser null
cuando no haya más elementos. Siempre que no sea null
, representará este método:
private async Task ProcessQueue()
{
try
{
while (queue.Count != 0)
{
Func<Task> command = queue.Dequeue();
try
{
await command();
}
catch (Exception ex)
{
// Exceptions from your queued tasks will end up here.
throw;
}
}
}
finally
{
queueProcessor = null;
}
}
Su método Enqueue
se vería así:
private void Enqueue(Func<Task> command)
{
queue.Enqueue(command);
if (queueProcessor == null)
queueProcessor = ProcessQueue();
}
En este momento, tengo el manejo de excepciones configurado de esta manera: cualquier comando en cola que arroje una excepción hará que el procesador de cola detenga el procesamiento (con la misma excepción). Esto puede no ser el mejor comportamiento para su aplicación.
Puedes usarlo así (ya sea con un lambda o un método real, por supuesto):
Enqueue(async () =>
{
ShowProgressIndicator = true;
ModelData = await myProxy.DownloadStringTaskAsync();
ShowProgressIndicator = false;
});
Tenga en cuenta el uso de DownloadStringTaskAsync
. Si escribe wrappers TAP para sus miembros EAP , su código async
será más "natural" (es decir, más simple).
Esto es lo suficientemente complejo como para recomendarlo en una clase separada, pero primero querrías decidir cómo manejar (y poner a la superficie) los errores.
¿Cuál es la forma correcta de poner en cola tareas complejas en wp8?
Las tareas consisten en lo siguiente:
- Mostrando un indicador de
ProgressIndicator
mediante la actualización de una variable de modelo - Recuperar o almacenar datos en un servicio
UploadStringAsync
(UploadStringAsync
) - Actualizando el modelo potencialmente vinculado a datos con el resultado de
UploadStringCompleted
. - Ocultando el
ProgressIndicator
mediante la actualización de una variable de modelo
Actualmente, he estado trabajando con una clase que posee una cola de objetos de comando, ejecutando un único hilo que se inicia cuando se agrega un elemento, si aún no se está ejecutando.
Sin embargo, tengo problemas con la espera de tareas o subtareas donde el código deja de ejecutarse.
Anteriormente, he utilizado asincronización, pero algunos niveles de comportamiento se hacían cada vez más impredecibles.
Lo que quiero es que el hilo principal sea capaz de crear y poner en cola objetos de comando. Los objetos de comando deben ejecutarse uno a la vez, no comenzando uno nuevo hasta que el anterior esté completamente terminado. Los objetos de comando deberían poder usar el despachador para acceder al hilo principal si es necesario.