Pregunta

Estoy implementando una aplicación donde el usuario tendrá la opción de descargar los activos (aproximadamente 750 MB en imágenes, cada una de las cuales está alrededor de 50kb de tamaño). No puedo hacer esto utilizando el httpclient regular, ya que si el usuario presiona el botón Inicio, las API de SENDASYNC / GETASYNC no funcionan en el fondo y se bloquean cuando el usuario vuelve a la aplicación.

Mi única opción aquí es usar el trasfondo transferente que estoy usando de la siguiente manera: -

for(...)//calling the download function here
    DownloadImageToIsoStore(planImageUri, cemetery_id + "_plan_1.gif", countryName);


public void DownloadImageToIsoStore(Uri imageUri, string imageName,string countryName)
    {
        while ((BackgroundTransferService.Requests.Count()) >= 25) { Thread.Sleep(100); }//do not add if count is 25 since that is the limit. added this to wait till space frees up in the queue

        BackgroundTransferRequest backgroundTransferRequest = new BackgroundTransferRequest(imageUri);
        backgroundTransferRequest.Method = "GET";
        backgroundTransferRequest.DownloadLocation = new Uri("shared/transfers/" + imageName, UriKind.RelativeOrAbsolute);//shared/transfers is the required directory
        backgroundTransferRequest.Tag = countryName;//will check this when download is completed
        backgroundTransferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;

        BackgroundTransferService.Add(backgroundTransferRequest);

        backgroundTransferRequest.TransferStatusChanged +=  new EventHandler<BackgroundTransferEventArgs>(backgroundTransferRequest_TransferStatusChanged);
        backgroundTransferRequest.TransferProgressChanged +=  new EventHandler<BackgroundTransferEventArgs>(backgroundTransferRequest_TransferProgressChanged);

    }

void backgroundTransferRequest_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
    {
        long bytes = e.Request.BytesReceived;
        Debug.WriteLine(bytes);
    }

void backgroundTransferRequest_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
    {
        BackgroundTransferRequest backgroundTransferRequest = e.Request;
        BackgroundTransferService.Remove(backgroundTransferRequest);
    }

Las descargas se completan con éxito, pero por alguna razón, no se llama a los eventos de FondoRansferrequest_TransferProSchangschanged y BackgroundSferrequest_TransferStatusChanged, no se llama y no puedo liberar la cola de descarga para cualquier descarga adicional.

¡Por favor ayuda!

gracias

¿Fue útil?

Solución

El problema fue que estaba ejecutando el bucle que estaba llamando a la descargaimagetoisostore en el hilo de la interfaz de usuario.

El estado de transferencia cambiado y el progreso cambió de eventos, aparentemente necesitan el hilo de UI.Tan pronto como moví la función de llamada a un hilo separado, el estado y el progreso cambiaron a los eventos comenzó a disparar como se esperaba.

Otros consejos

No es la razón por la que creo.Añadiste la solicitud al servicio de fondo sin colocar los manipuladores.Los manejadores deben estar conectados antes de agregar la solicitud al servicio de fondo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top