Panggil API asinkron dalam C# atau Visual Basic

Universal Windows Platform (UWP) mencakup banyak API asinkron untuk memastikan bahwa aplikasi Anda tetap responsif ketika berfungsi yang mungkin membutuhkan waktu yang lama. Topik ini membahas cara menggunakan metode asinkron dari UWP di C # atau Microsoft Visual Basic.

API asinkron mencegah aplikasi Anda menunggu operasi besar selesai sebelum melanjutkan eksekusi. Misalnya, aplikasi yang mengunduh info dari Internet mungkin menghabiskan beberapa detik menunggu info tiba. Jika Anda menggunakan metode sinkron untuk mengambil info, aplikasi diblokir hingga metode kembali. Aplikasi tidak akan menanggapi interaksi pengguna dan karena tampaknya tidak responsif, pengguna mungkin menjadi frustrasi. Dengan menyediakan API asinkron, UWP membantu memastikan bahwa aplikasi Anda tetap responsif terhadap pengguna saat melakukan operasi yang panjang.

Sebagian besar API asinkron di UWP tidak memiliki rekan sinkron, jadi Anda harus yakin untuk memahami cara menggunakan API asinkron dengan C # atau Visual Basic di aplikasi Universal Windows Platform (UWP) Anda. Di sini kami menunjukkan cara memanggil API asinkron UWP.

Menggunakan API asinkron

Dengan konvensi, metode asinkron diberi nama yang diakhiri dengan "Async". Anda biasanya memanggil API asinkron sebagai respons terhadap tindakan pengguna, seperti saat pengguna mengklik tombol. Memanggil metode asinkron dalam penangan peristiwa adalah salah satu cara paling sederhana untuk menggunakan API asinkron. Di sini kita menggunakan operator menunggu sebagai contoh.

Misalkan Anda memiliki aplikasi yang mencantumkan judul posting blog dari lokasi tertentu. Aplikasi ini memiliki Tombol yang diklik pengguna untuk mendapatkan judul. Judul ditampilkan dalam TextBlock. Ketika pengguna mengklik tombol, penting bahwa aplikasi tetap responsif sambil menunggu info dari situs web blog. Untuk memastikan responsivitas ini, UWP menyediakan metode asinkron, SyndicationClient.RetrieveFeedAsync, untuk mengunduh feed.

Contoh di sini mendapatkan daftar posting blog dari blog dengan memanggil metode asinkron, SyndicationClient.RetrieveFeedAsync, dan menunggu hasilnya.

// 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();

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

    try
    {
        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();
    }
}
' Put the keyword Async on the declaration of the event handler.
Private Async Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    Dim client As New Windows.Web.Syndication.SyndicationClient()
    Dim feedUri As New Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx")

    Try
        Dim feed As SyndicationFeed = Await client.RetrieveFeedAsync(feedUri)

        ' The rest of this method executes after the await operation completes.
        rssOutput.Text = feed.Title.Text & vbCrLf

        For Each item In feed.Items
            rssOutput.Text += $"{item.Title.Text}, {item.PublishedDate.ToString()}{vbCrLf}"
        Next

    Catch ex As Exception
        ' 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()
    End Try

End Sub

Ada beberapa hal penting tentang contoh ini. Pertama, baris, SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) menggunakan operator tunggu dengan panggilan ke metode asinkron, RetrieveFeedAsync. Anda dapat menganggap operator menunggu sebagai memberitahu compiler bahwa Anda memanggil metode asinkron, yang menyebabkan compiler untuk melakukan beberapa pekerjaan tambahan sehingga Anda tidak perlu. Selanjutnya, deklarasi penangan peristiwa menyertakan kata kunci async. Anda harus menyertakan kata kunci ini dalam deklarasi metode metode apa pun di mana Anda menggunakan operator menunggu .

Dalam topik ini, kami tidak akan membahas banyak detail tentang apa yang dilakukan kompiler dengan operator tunggu , tetapi mari kita periksa apa yang dilakukan aplikasi Anda sehingga asinkron dan responsif. Pertimbangkan apa yang terjadi ketika Anda menggunakan kode sinkron. Misalnya, misalkan ada metode yang disebut SyndicationClient.RetrieveFeed sinkron. (Tidak ada metode seperti itu, tetapi bayangkan ada.) Jika aplikasi Anda menyertakan baris SyndicationFeed feed = client.RetrieveFeed(feedUri), bukan SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), eksekusi aplikasi akan berhenti sampai nilai RetrieveFeed pengembalian tersedia. Dan sementara aplikasi Anda menunggu metode selesai, aplikasi tidak dapat menanggapi acara lain, seperti acara Klik lainnya. Artinya, aplikasi Anda akan diblokir sampai RetrieveFeed kembali.

Tetapi jika Anda menelepon client.RetrieveFeedAsync, metode ini memulai pengambilan dan segera kembali. Saat Anda menggunakan tunggu dengan RetrieveFeedAsync, aplikasi untuk sementara keluar dari penangan peristiwa. Kemudian dapat memproses peristiwa lain sementara RetrieveFeedAsync mengeksekusi secara asinkron. Ini membuat aplikasi responsif terhadap pengguna. Ketika RetrieveFeedAsync selesai dan SyndicationFeed tersedia, aplikasi pada dasarnya masuk kembali ke penangan peristiwa di mana ia tinggalkan, setelah SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), dan menyelesaikan sisa metode.

Hal yang menyenangkan tentang menggunakan operator menunggu adalah bahwa kode tidak terlihat jauh berbeda dari bagaimana kode terlihat jika Anda menggunakan metode imajiner RetrieveFeed . Ada cara untuk menulis kode asinkron dalam C # atau Visual Basic tanpa operator tunggu, tetapi kode yang dihasilkan cenderung menekankan mekanisme eksekusi secara asinkron. Hal ini membuat kode asinkron sulit ditulis, sulit dipahami, dan sulit dipertahankan. Dengan menggunakan operator tunggu , Anda mendapatkan manfaat dari aplikasi asinkron tanpa membuat kode Anda rumit.

Mengembalikan jenis dan hasil API asinkron

Jika Anda mengikuti tautan ke RetrieveFeedAsync, Anda mungkin telah memperhatikan bahwa jenis pengembalian RetrieveFeedAsync bukan SyndicationFeed. Sebaliknya, jenis pengembalian adalah IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>. Dilihat dari sintaks mentah, API asinkron mengembalikan objek yang berisi hasil di dalamnya. Meskipun umum, dan kadang-kadang berguna, untuk memikirkan metode asinkron sebagai yang ditunggu-tunggu, operator menunggu benar-benar beroperasi pada nilai pengembalian metode, bukan pada metode. Ketika Anda menerapkan operator tunggu , apa yang Anda dapatkan kembali adalah hasil dari memanggil GetResult pada objek yang dikembalikan dengan metode. Dalam contoh, SyndicationFeed adalah hasil dari RetrieveFeedAsync.GetResult().

Ketika Anda menggunakan metode asinkron, Anda dapat memeriksa tanda tangan untuk melihat apa yang akan Anda dapatkan kembali setelah menunggu nilai yang dikembalikan dari metode. Semua API asinkron di UWP mengembalikan salah satu jenis berikut:

Jenis hasil metode asinkron sama dengan TResult parameter tipe. Jenis tanpa TResult tidak memiliki hasil. Anda dapat menganggap hasilnya sebagai kekosongan. Dalam Visual Basic, Sub prosedur setara dengan metode dengan jenis pengembalian kosong.

Tabel di sini memberikan contoh metode asinkron dan mencantumkan jenis pengembalian dan jenis hasil masing-masing.

Metode asinkron Tipe hasil Jenis Hasil
SyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgressSyndicationFeed<, RetrievalProgress> SindikasiFeed
FileOpenPicker.picksingleFileasync IAsyncOperationstorageFile<> StorageFile
XmlDocument.SaveToFileAsync IAsyncAction kosong
InkStrokeContainer.LoadAsync IAsyncActionWithProgressUInt64<> kosong
DataReader.LoadAsync DataReaderLoadOperation, kelas hasil kustom yang mengimplementasikan IAsyncOperationUInt32<> UInt32

 

Metode asinkron yang didefinisikan dalam .NET untuk aplikasi UWP memiliki jenis pengembalian Tugas atau TaskTResult<>. Metode yang mengembalikan Tugas mirip dengan metode asinkron di UWP yang mengembalikan IAsyncAction. Dalam setiap kasus, hasil dari metode asinkron batal. Tipe pengembalian TaskTResult<> mirip dengan IAsyncOperationTResult<> karena hasil metode asinkron saat menjalankan tugas adalah tipe yang sama dengan TResult parameter tipe. Untuk info selengkapnya tentang menggunakan aplikasi dan tugas .NET untuk UWP, lihat ikhtisar aplikasi .NET untuk Windows Runtime.

Menangani kesalahan

Ketika Anda menggunakan operator tunggu untuk mengambil hasil Anda dari metode asinkron, Anda dapat menggunakan blok coba / tangkap untuk menangani kesalahan yang terjadi dalam metode asinkron, seperti yang Anda lakukan untuk metode sinkron. Contoh sebelumnya membungkus metode RetrieveFeedAsync dan menunggu operasi dalam blok coba / tangkap untuk menangani kesalahan saat pengecualian dilemparkan.

Ketika metode asinkron memanggil metode asinkron lainnya, metode asinkron apa pun yang menghasilkan pengecualian akan disebarkan ke metode luar. Ini berarti Anda dapat menempatkan blok try / catch pada metode paling luar untuk menangkap kesalahan untuk metode asinkron bersarang. Sekali lagi, ini mirip dengan bagaimana Anda menangkap pengecualian untuk metode sinkron. Namun, Anda tidak dapat menggunakan tunggu di blok tangkapan .

Ujung Dimulai dengan C # di Microsoft Visual Studio tahun 2005, Anda dapat menggunakan menunggu di blok tangkapan.

Ringkasan dan langkah selanjutnya

Pola memanggil metode asinkron yang kami tampilkan di sini adalah yang paling sederhana untuk digunakan saat Anda memanggil API asinkron dalam penangan peristiwa. Anda juga dapat menggunakan pola ini saat Anda memanggil metode asinkron dalam metode utama yang mengembalikan void atau Sub dalam Visual Basic.

Ketika Anda menemukan metode asinkron di UWP, penting untuk diingat:

  • Dengan konvensi, metode asinkron diberi nama yang diakhiri dengan "Async".
  • Metode apa pun yang menggunakan operator tunggu harus memiliki deklarasi yang ditandai dengan kata kunci async .
  • Ketika aplikasi menemukan operator tunggu , aplikasi tetap responsif terhadap interaksi pengguna saat metode asinkron dijalankan.
  • Menunggu nilai yang dikembalikan dengan metode asinkron mengembalikan objek yang berisi hasilnya. Dalam kebanyakan kasus, hasil yang terkandung dalam nilai pengembalian adalah apa yang berguna, bukan nilai pengembalian itu sendiri. Anda dapat menemukan jenis nilai yang terkandung di dalam hasil dengan melihat jenis pengembalian metode async.
  • Menggunakan API asinkron dan pola asinkron sering kali merupakan cara untuk meningkatkan responsivitas aplikasi Anda.

Contoh dalam topik ini mengeluarkan teks yang terlihat seperti ini.

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