//TASK PARALLEL LIBRARY
 void LLama_TaskParallelLibrary(ProgressCircleView tem_pcv, string url_archivo)
 {
     Task.Factory.StartNew(() => {
         DescargaArchivo(tem_pcv, url_archivo);
     })
     .ContinueWith(task => RunOnUiThread(() => tem_pcv.setPorcentaje(100)));
 }
 //SYSTEM.THREAD
 void LLama_SystemThread(ProgressCircleView tem_pcv, string url_archivo)
 {
     new Thread(new ThreadStart(() =>
     {
         DescargaArchivo(tem_pcv, url_archivo);
     })).Start();
 }
 //JAVA THREAD METODOS
 void LLama_JavaThread(ProgressCircleView tem_pcv, string url_archivo)
 {
     new Java.Lang.Thread(() =>
     {
         DescargaArchivo(tem_pcv, url_archivo);
     }).Start();
 }
        //***************************************************************************************************
        //******************FUNCION  QUE SE ENCARGA DEL PROCESO DE DESCARGA DE ARCHIVO***********************
        //***************************************************************************************************
        void DescargaArchivo(ProgressCircleView tem_pcv, string url_archivo)
        {
            //OBTENEMOS LA RUTA DONDE SE ENCUENTRA LA CARPETA PICTURES DE NUESTRO DISPOSITIVO Y LE CONCTENAMOS
            //EL NOMBRE DE UNA CARPETA NUEVA CARPETA, ES AQUI DONDE GUADAREMOS EL ARCHIVO A DESCARGAR
            string filePath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath + "/DescargaImagen/";

            Java.IO.File directory = new Java.IO.File(filePath);

            //VERIFICAMOS SI LA CARPETA EXISTE, SI NO LA CREAMOS
            if (directory.Exists() == false)
            {
                directory.Mkdir();
            }

            //ESTABLECEMOS LA UBICACION DE NUESTRO ARCHIVO A DESCARGAR
            URL url = new URL(url_archivo);

            //CABRIMOS UNA CONEXION CON EL ARCHIVO
            URLConnection conexion = url.OpenConnection();

            conexion.Connect();

            //OBTENEMOS EL TAMAÑO DEL ARCHIVO A DESCARGAR
            int lenghtOfFile = conexion.ContentLength;

            //CREAMOS UN INPUTSTREAM PARA PODER EXTRAER EL ARCHIVO DE LA CONEXION
            InputStream input = new BufferedInputStream(url.OpenStream());

            //ASIGNAMOS LA RUTA DONDE SE GUARDARA EL ARCHIVO, Y ASIGNAMOS EL NOMBRE CON EL QUE SE DESCARGAR EL ARCHIVO
            //PARA ESTE CASO CONSERVA EL MISMO NOMBRE
            string NewFile = directory.AbsolutePath + "/" + url_archivo.Substring(url_archivo.LastIndexOf("/") + 1);

            //CREAMOS UN OUTPUTSTREAM EN EL CUAL UTILIZAREMOS PARA CREAR EL ARCHIVO QUE ESTAMOS DESCARGANDO
            OutputStream output = new FileOutputStream(NewFile);

            byte[] data  = new byte[lenghtOfFile];
            long   total = 0;

            int count;

            //COMENSAMOS A LEER LOS DATOS DE NUESTRO INPUTSTREAM
            while ((count = input.Read(data)) != -1)
            {
                total += count;
                //CON ESTA OPCION REPORTAMOS EL PROGRESO DE LA DESCARGA EN PORCENTAJE A NUESTRO CONTROL
                //QUE SE ENCUENTRA EN EL HILO PRINCIPAL
                RunOnUiThread(() => tem_pcv.setPorcentaje((int)((total * 100) / lenghtOfFile)));

                //ESCRIBIMOS LOS DATOS DELIDOS ES NUESTRO OUTPUTSTREAM
                output.Write(data, 0, count);
            }
            output.Flush();
            output.Close();
            input.Close();

            //INDICAMOS A NUESTRO PROGRESS QUE SE HA COMPLETADO LA DESCARGA AL 100%
            RunOnUiThread(() => tem_pcv.setPorcentaje(100));
        }
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it

            //JAVA THREAD
            ProgressCircleView pv_Porcentaje_uno = FindViewById <ProgressCircleView> (Resource.Id.pv_Porcentaje_uno);
            Button             btnJavaThread     = FindViewById <Button> (Resource.Id.btnJavaThread);

            btnJavaThread.Click += delegate {
                LLama_JavaThread(pv_Porcentaje_uno, "http://www.sullenclothing.com/Porcelain_18x24_Giclee.jpg");
            };

            //SYSTEM.THREAD
            ProgressCircleView pv_Porcentaje_dos = FindViewById <ProgressCircleView> (Resource.Id.pv_Porcentaje_dos);
            Button             btnThread         = FindViewById <Button> (Resource.Id.btnThread);

            btnThread.Click += delegate {
                LLama_SystemThread(pv_Porcentaje_dos, "http://www.sullenclothing.com/HeadHunter_18x24_Giclee.jpg");
            };

            //TASK PARALLEL LIBRARY
            ProgressCircleView pv_Porcentaje_tres     = FindViewById <ProgressCircleView> (Resource.Id.pv_Porcentaje_tres);
            Button             btnTaskParallelLibrary = FindViewById <Button> (Resource.Id.btnTaskParallelLibrary);

            btnTaskParallelLibrary.Click += delegate {
                LLama_TaskParallelLibrary(pv_Porcentaje_tres, "http://www.sullenclothing.com/ConfilctedBlk_18x24_Giclee.jpg");
            };

            //ASYNCTASK
            Button btnAsyncTask = FindViewById <Button> (Resource.Id.btnAsyncTask);

            btnAsyncTask.Click += delegate {
                LLama_Asynctask("http://www.sullenclothing.com/Gustavo_14x11_Giclee.jpg");
            };
        }