Este tema aún no ha recibido ninguna valoración - Valorar este tema

Inicio rápido: Llamada a API asincrónicas en C# o Microsoft Visual Basic

Windows en tiempo de ejecución incluye muchas API asincrónicas para que tu aplicación tenga capacidad de respuesta mientras realiza trabajos que pudieran llevar algún tiempo. Esto significa que tu aplicación no tiene que esperar a que finalicen operaciones grandes antes de continuar ejecutándose. Por ejemplo, una aplicación que descarga información de Internet probablemente destine varios segundos a esperar que la información llegue. Si usas un método sincrónico para recuperar la información, la aplicación se bloquea hasta que el método vuelve. La aplicación no responderá a la interacción del usuario y, dado que aparentemente no puede responder, es probable que el usuario se sienta frustrado. Gracias a las API asincrónicas, Windows en tiempo de ejecución ayuda a garantizar que tu aplicación continúe respondiendo al usuario mientras realiza operaciones largas.

La mayoría de las API asincrónicas en Windows en tiempo de ejecución no tiene su contrapartida sincrónica, por lo que debes asegurarte de comprender cómo se usan las API asincrónicas con C# o Visual Basic en tu aplicación de la Tienda Windows. Aquí te mostraremos como llamar a las API asincrónicas de Windows en tiempo de ejecución.

Guía básica: Relación de este tema con los demás. Consulta:

Requisitos previos

Consulta Crear la primera aplicación de la Tienda Windows con C# o Visual Basic.

Usar API asincrónicas

Convencionalmente, a los métodos asincrónicos se les asignan nombres terminados en "Async". Normalmente llamas a las API asincrónicas en respuesta a una acción del usuario, como cuando haces clic en un botón. Llamar un método asincrónico en un controlador de eventos es una de las formas más simples de usar API asincrónicas. Aquí usamos el operador await a modo de ejemplo.

Supongamos que tienes una aplicación que enumera títulos de entradas de blog desde cierta ubicación. La aplicación tiene un botón Button en el que el usuario hace clic para obtener los títulos. Los títulos se muestran en un TextBlock. Cuando el usuario hace clic en el botón, es importante que la aplicación continúe respondiendo mientras espera la información del sitio web del blog. Para garantizar esta capacidad de respuesta, Windows en tiempo de ejecución proporciona un método asincrónico, SyndicationClient.RetrieveFeedAsync, para descargar la fuente.

En este ejemplo se obtienen las listas de entradas de un blog llamando al método asincrónico, SyndicationClient.RetrieveFeedAsync. Esta es la forma más simple de llamar a un método asincrónico.


// Put the keyword, async on the declaration of the event handler.
private async void Button_Click_1(object sender, RoutedEventArgs e)
{

    Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();

    // Force the SyndicationClient to download the information.
    client.BypassCacheOnRetrieve = true;

    Uri feedUri
        = new Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx");

    try
    {
        // Call SyndicationClient RetrieveFeedAsync to download the list of blog posts.
        SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

        // The rest of this method executes after await RetrieveFeedAsync completes.
        rssOutput.Text = feed.Title.Text + Environment.NewLine;

        foreach (SyndicationItem item in feed.Items)
        {
            rssOutput.Text += item.Title.Text + ", " +
                             item.PublishedDate.ToString() + Environment.NewLine;
        }
    }
    catch (Exception ex)
    {
        // Log Error.
        rssOutput.Text =
            "I'm sorry, but I couldn't load the page," +
            " possibly due to network problems." +
            "Here's the error message I received: "
            + ex.ToString();
    }
}


Hay un par de aspectos importantes acerca de este ejemplo. En primer lugar, la línea, SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) usa el operador await o el operador Await en Visual Basic con la llamada al método asincrónico, RetrieveFeedAsync. Puedes considerar que el operador await indica al compilador que estás llamando a un método asincrónico, que hace que el compilador haga cierto trabajo extra para que no tengas que hacerlo. A continuación, la declaración del controlador de eventos incluye la palabra clave async o Async en Visual Basic. Debes incluir esta palabra clave en la declaración de cualquier método en el que uses el operador await.

En este tema no entraremos en muchos detalles acerca de lo que hace el compilador con el operador await, pero examinemos qué hace la aplicación para ser asincrónica y para tener capacidad de respuesta. Ten en cuenta lo que sucede cuando usas un código sincrónico. Por ejemplo, supongamos que existe un método llamado SyndicationClient.RetrieveFeed que es sincrónico. (No existe tal método, pero imaginemos por un momento que sí). Si tu aplicación incluyó la línea SyndicationFeed feed = client.RetrieveFeed(feedUri), en lugar de SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), la ejecución de la aplicación se detiene hasta que el valor devuelto de RetrieveFeed esté disponible. Mientras la aplicación espera que se complete el método, no puede responder a ningún otro evento, como por ejemplo otro evento Click. Es decir, tu aplicación permanece bloqueada hasta que se devuelva RetrieveFeed.

Pero si llamas a client.RetrieveFeedAsync, el método inicia la recuperación y vuelve de inmediato. Si usas await con RetrieveFeedAsync, la aplicación sale temporalmente del controlador de eventos. Después puede procesar otros eventos mientras RetrieveFeedAsync se ejecuta asincrónicamente. Esto hace que la aplicación responda al usuario. Cuando RetrieveFeedAsync se completa y SyndicationFeed se encuentra disponible, la aplicación vuelve a entrar en el controlador de eventos de donde salió, después de SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), y finaliza el resto del método.

Lo bueno de usar el operador await es que el código no es muy distinto del código que se utiliza en el método RetrieveFeed imaginario. El código asincrónico de C# o Visual Basic se puede escribir de distintas maneras sin el operador await, pero el código resultante tiende a enfatizar la mecánica de ejecución asincrónica. Esto hace que el código asincrónico sea difícil escribir, comprender y mantener. Con el operador await, obtienes las ventajas de una aplicación asincrónica sin que el código sea complejo.

Tipo y resultados devueltos de las API asincrónicas

Si seguiste el vínculo a RetrieveFeedAsync, posiblemente hayas notado que el tipo devuelto de RetrieveFeedAsync no es SyndicationFeed. En su lugar, el tipo devuelto es IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> o IAsyncOperationWithProgress(Of SyndicationFeed, RetrievalProgress) en Visual Basic. Una API asincrónica devuelve un objeto que contiene el resultado. Si bien es común, y a veces útil, considerar que el método asincrónico está disponible, el operador await realmente opera sobre el valor devuelto del método y no sobre el método. Cuando aplicas el operador await, obtienes el resultado de los métodos asincrónicos. En el ejemplo, SyndicationFeed es el resultado de RetrieveFeedAsync.

Cuando usas un método asincrónico, puedes obtener información sobre su resultado examinando el tipo devuelto. Todas las API asincrónicas en Windows en tiempo de ejecución devuelven uno de los siguientes tipos:

El tipo de resultado de un método asincrónico es el mismo que el parámetro del tipo TResult. Los tipos sin TResult no tienen un resultado. Puedes considerar que el resultado es void. En Visual Basic, un procedimiento Sub equivale a un método con un tipo devuelto void

En esta tabla se proporcionan ejemplos de métodos asincrónicos y se indican el tipo devuelto y el tipo de resultado de cada uno.

Método asincrónicoTipo devuelto Tipo de resultado
SyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> SyndicationFeed
ContactPicker.PickSingleContactAsync IAsyncOperation<ContactInformation> ContactInformation
XmlDocument.SaveToFileAsync IAsyncAction void
InkStrokeContainer.LoadAsync IAsyncActionWithProgress<ulong>void
RandomAccessStream.CopyAsync IAsyncOperationWithProgress<ulong,ulong>ulong
DataReader.LoadAsync DataReaderLoadOperation, que implementa IAsyncOperation<uint>uint

 

Los métodos asincrónicos que están en .NET for Windows Store apps tienen un valor devuelto Task o Task<TResult> . Los métodos que devuelven Task son similares a los métodos asincrónicos de Windows en tiempo de ejecución que devuelven IAsyncAction. En cada caso, el resultado del método asincrónico es void. De igual manera, el tipo devuelto Task<TResult> es similar a IAsyncOperation<TResult> en que el resultado del método asincrónico es el mismo tipo que el parámetro de tipo TResult. Para obtener más información sobre el uso de .NET for Windows Store apps, consulta Introducción a .NET para aplicaciones de la Tienda Windows.

Control de errores

Cuando uses el operador await para recuperar tus resultados de un método asincrónico, puedes usar un bloque try/catch para controlar los errores que se producen en los métodos asincrónicos, tal y como lo harías para los métodos sincrónicos. El ejemplo anterior encapsula el método RetrieveFeedAsync y la operación await en un bloque try/catch para controlar errores cuando se inicia una excepción.

Cuando los métodos asincrónicos llaman a otros métodos asincrónicos, cualquier método asincrónico que dé origen a una excepción se propagará a los métodos externos. Esto significa que puedes poner un bloque try/catch en el método más externo para capturar los errores de los métodos asincrónicos anidados. Una vez más, esto es similar al modo en que capturas excepciones para los métodos sincrónicos.

Resumen y next steps

El patrón de llamada a un método asincrónico que mostramos aquí es el más sencillo de usar cuando se llama a API asincrónicas en un controlador de eventos. También puedes usar este patrón cuando llames a un método asincrónico en un método anulado que devuelve void o un Sub en Visual Basic.

A medida que encuentras métodos asincrónicos en Windows en tiempo de ejecución, conviene recordar:

  • Convencionalmente, a los métodos asincrónicos se les asignan nombres terminados en "Async".
  • Todo método que use el operador await debe tener la declaración marcada con la palabra clave async.
  • Cuando la aplicación encuentra el operador await, la aplicación continúa respondiendo a la interacción del usuario mientras se ejecuta el método asincrónico.
  • Un método asincrónico devuelve un objeto que contiene su resultado. En la mayoría de los casos, lo útil es el resultado del valor devuelto, no el valor devuelto en sí mismo. Puedes encontrar el tipo de resultado examinando el tipo devuelto.

El ejemplo de este tema produce texto con la siguiente apariencia.

Windows Experience Blog
PC Snapshot: Sony VAIO Y, 8/9/2011 10:26:56 AM -07:00
Tech Tuesday Live Twitter #Chat: Too Much Tech #win7tech, 8/8/2011 12:48:26 PM -07:00
Windows 7 themes: what’s new and what’s popular!, 8/4/2011 11:56:28 AM -07:00
PC Snapshot: Toshiba Satellite A665 3D, 8/2/2011 8:59:15 AM -07:00
Time for new school supplies? Find back-to-school deals on Windows 7 PCs and Office 2010, 8/1/2011 2:14:40 PM -07:00
Best PCs for blogging (or working) on the go, 8/1/2011 10:08:14 AM -07:00
Tech Tuesday – Blogging Tips and Tricks–#win7tech, 8/1/2011 9:35:54 AM -07:00
PC Snapshot: Lenovo IdeaPad U460, 7/29/2011 9:23:05 AM -07:00
GIVEAWAY: Survive BlogHer with a Sony VAIO SA and a Samsung Focus, 7/28/2011 7:27:14 AM -07:00
3 Ways to Stay Cool This Summer, 7/26/2011 4:58:23 PM -07:00
Getting RAW support in Photo Gallery & Windows 7 (…and a contest!), 7/26/2011 10:40:51 AM -07:00
Tech Tuesdays Live Twitter Chats: Photography Tips, Tricks and Essentials, 7/25/2011 12:33:06 PM -07:00
3 Tips to Go Green With Your PC, 7/22/2011 9:19:43 AM -07:00
How to: Buy a Green PC, 7/22/2011 9:13:22 AM -07:00
Windows 7 themes: the distinctive artwork of Cheng Ling, 7/20/2011 9:53:07 AM -07:00

Temas relacionados

Guía básica para crear aplicaciones de la Tienda Windows con C# o Visual Basic
Programación asincrónica basada en tareas (TAP)
Escenarios de la característica de muestra Reversi: código asincrónico

 

 

© 2013 Microsoft. Reservados todos los derechos.