Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Cómo: Crear tareas precalculadas

.NET Framework 4.5

Este documento se describe cómo usar el método de Task.FromResult<TResult> para recuperar los resultados de las operaciones asincrónicas de descarga que se retienen en la memoria caché. El método de FromResult<TResult> devuelve un objeto terminado de Task<TResult> que celebre el valor proporcionado como su propiedad de Result . Este método es útil cuando se realiza una operación asincrónica que devuelve un objeto Task<TResult> y el resultado de ese objeto Task<TResult> ya se ha calculado.

El ejemplo siguiente descarga las cadenas de web. Define el método de DownloadStringAsync . Este método descarga las cadenas de web de forma asincrónica. Este ejemplo también utiliza un objeto de ConcurrentDictionary<TKey, TValue> almacenar en caché los resultados de operaciones anteriores. Si se celebra la dirección de la entrada en esta memoria caché, DownloadStringAsync utiliza el método de FromResult<TResult> para generar un objeto de Task<TResult> que contiene el contenido en esa dirección. Si no, DownloadStringAsync descarga el archivo web y agrega el resultado a la memoria caché.


using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

// Demonstrates how to use Task<TResult>.FromResult to create a task 
// that holds a pre-computed result.
class CachedDownloads
{
   // Holds the results of download operations.
   static ConcurrentDictionary<string, string> cachedDownloads =
      new ConcurrentDictionary<string, string>();

   // Asynchronously downloads the requested resource as a string.
   public static Task<string> DownloadStringAsync(string address)
   {
      // First try to retrieve the content from cache.
      string content;
      if (cachedDownloads.TryGetValue(address, out content))
      {
         return Task.FromResult<string>(content);
      }

      // If the result was not in the cache, download the 
      // string and add it to the cache.
      return Task.Run(async () =>
      {
         content = await new WebClient().DownloadStringTaskAsync(address);
         cachedDownloads.TryAdd(address, content);
         return content;
      });
   }

   static void Main(string[] args)
   {
      // The URLs to download.
      string[] urls = new string[]
      {
         "http://msdn.microsoft.com",
         "http://www.contoso.com",
         "http://www.microsoft.com"
      };

      // Used to time download operations.
      Stopwatch stopwatch = new Stopwatch();

      // Compute the time required to download the URLs.
      stopwatch.Start();
      var downloads = from url in urls
                      select DownloadStringAsync(url);
      Task.WhenAll(downloads).ContinueWith(results =>
      {
         stopwatch.Stop();

         // Print the number of characters download and the elapsed time.
         Console.WriteLine("Retrieved {0} characters. Elapsed time was {1} ms.",
            results.Result.Sum(result => result.Length),
            stopwatch.ElapsedMilliseconds);
      })
      .Wait();

      // Perform the same operation a second time. The time required
      // should be shorter because the results are held in the cache.
      stopwatch.Restart();
      downloads = from url in urls
                  select DownloadStringAsync(url);
      Task.WhenAll(downloads).ContinueWith(results =>
      {
         stopwatch.Stop();

         // Print the number of characters download and the elapsed time.
         Console.WriteLine("Retrieved {0} characters. Elapsed time was {1} ms.",
            results.Result.Sum(result => result.Length),
            stopwatch.ElapsedMilliseconds);
      })
      .Wait();
   }
}

/* Sample output:
Retrieved 27798 characters. Elapsed time was 1045 ms.
Retrieved 27798 characters. Elapsed time was 0 ms.
*/


Este ejemplo calcula el tiempo necesario para descargar varias cadenas dos veces. El segundo conjunto de operaciones de descarga debe tardar menos tiempo que el primer conjunto porque los resultados se retienen en la memoria caché. El método de FromResult<TResult> permite que el método de DownloadStringAsync para crear los objetos de Task<TResult> que contienen estos resultados pre- calculados.

Copie el código de ejemplo y péguelo en un proyecto de Visual Studio, o péguelo en un archivo denominado CachedDownloads.cs (CachedDownloads.vb para Visual Basic), y ejecutar el siguiente comando en una ventana de símbolo del sistema de Visual Studio.

Visual C#

csc.exe CachedDownloads.cs

Visual Basic

vbc.exe CachedDownloads.vb

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft