Memanggil API asinkron di C# atau Visual Basic

Platform Windows Universal (UWP) mencakup banyak API asinkron untuk memastikan bahwa aplikasi Anda tetap responsif saat berfungsi yang mungkin memakan waktu 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 ini 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 panjang.

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

Menggunakan API asinkron

Menurut konvensi, metode asinkron diberi nama yang berakhiran "Asinkron". Anda biasanya memanggil API asinkron sebagai respons terhadap tindakan pengguna, seperti saat pengguna mengklik tombol. Memanggil metode asinkron dalam penanganan aktivitas adalah salah satu cara paling sederhana untuk menggunakan API asinkron. Di sini kita menggunakan operator tunggu 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 saat menunggu info dari situs web blog. Untuk memastikan responsivitas ini, UWP menyediakan metode asinkron, SyndicationClient.RetrieveFeedAsync, untuk mengunduh umpan.

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 tunggu sebagai memberi tahu pengompilasi bahwa Anda memanggil metode asinkron, yang menyebabkan kompilator melakukan beberapa pekerjaan tambahan sehingga Anda tidak perlu melakukannya. Selanjutnya, deklarasi penanganan aktivitas menyertakan asinkron kata kunci. Anda harus menyertakan kata kunci ini dalam deklarasi metode dari metode apa pun di mana Anda menggunakan operator tunggu .

Dalam topik ini, kami tidak akan masuk ke banyak detail tentang apa yang dilakukan pengompilasi dengan operator tunggu , tetapi mari kita periksa apa yang dilakukan aplikasi Anda sehingga tidak sinkron dan responsif. Pertimbangkan apa yang terjadi saat Anda menggunakan kode sinkron. Misalnya, ada metode yang disebut SyndicationClient.RetrieveFeed yang sinkron. (Tidak ada metode seperti itu, tetapi bayangkan bahwa ada.) Jika aplikasi Anda menyertakan baris SyndicationFeed feed = client.RetrieveFeed(feedUri), alih-alih SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), eksekusi aplikasi akan berhenti hingga nilai RetrieveFeed pengembalian tersedia. Dan saat aplikasi Anda menunggu metode selesai, aplikasi tidak dapat merespons peristiwa lain, seperti peristiwa Klik lainnya. Artinya, aplikasi Anda akan diblokir hingga RetrieveFeed kembali.

Tetapi jika Anda memanggil client.RetrieveFeedAsync, metode memulai pengambilan dan segera kembali. Saat Anda menggunakan tunggu dengan RetrieveFeedAsync, aplikasi untuk sementara keluar dari penanganan aktivitas. Kemudian dapat memproses peristiwa lain saat RetrieveFeedAsync dijalankan secara asinkron. Ini membuat aplikasi tetap responsif terhadap pengguna. Ketika RetrieveFeedAsync selesai dan SyndicationFeed tersedia, aplikasi pada dasarnya masuk kembali ke penanganan aktivitas yang ditinggalkannya, setelah SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), dan menyelesaikan sisa metode.

Hal yang bagus tentang menggunakan operator tunggu adalah bahwa kode tidak terlihat jauh berbeda dari bagaimana kode terlihat jika Anda menggunakan metode imajiner RetrieveFeed . Ada cara untuk menulis kode asinkron di C# atau Visual Basic tanpa operator tunggu , tetapi kode yang dihasilkan cenderung menekankan mekanisme eksekusi secara asinkron. 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 kompleks.

Mengembalikan jenis dan hasil API asinkron

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

Saat 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 jenis. Jenis tanpa TResult tidak memiliki hasil. Anda dapat menganggap hasilnya batal. Di Visual Basic, Sub prosedur setara dengan metode dengan jenis pengembalian yang batal .

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

Metode asinkron Tipe hasil Jenis Hasil
SyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> SyndicationFeed
FileOpenPicker.PickSingleFileAsync IAsyncOperation<StorageFile> StorageFile
XmlDocument.SaveToFileAsync IAsyncAction batal
InkStrokeContainer.LoadAsync IAsyncActionWithProgress<UInt64> batal
DataReader.LoadAsync DataReaderLoadOperation, kelas hasil kustom yang mengimplementasikan IAsyncOperation<UInt32> UInt32

 

Metode asinkron yang ditentukan dalam .NET untuk aplikasi UWP memiliki jenis pengembalian Tugas atau TResult> Tugas<. Metode yang mengembalikan Tugas mirip dengan metode asinkron di UWP yang mengembalikan IAsyncAction. Dalam setiap kasus, hasil metode asinkron dibatalkan. Jenis pengembalian Task<TResult> mirip dengan IAsyncOperation<TResult> karena hasil metode asinkron saat menjalankan tugas adalah jenis yang sama dengan TResult parameter jenis. Untuk informasi selengkapnya tentang menggunakan .NET untuk aplikasi dan tugas UWP , lihat gambaran umum aplikasi .NET untuk Windows Runtime.

Menangani kesalahan

Saat Anda menggunakan operator tunggu untuk mengambil hasil Anda dari metode asinkron, Anda dapat menggunakan blok try/catch 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 try/catch untuk menangani kesalahan saat pengecualian dilemparkan.

Ketika metode asinkron memanggil metode asinkron lainnya, metode asinkron apa pun yang menghasilkan pengecualian akan disebarluaskan ke metode luar. Ini berarti Anda dapat menempatkan blok coba/tangkap pada metode paling luar untuk menangkap kesalahan untuk metode asinkron berlapis. Sekali lagi, ini mirip dengan cara Anda menangkap pengecualian untuk metode sinkron. Namun, Anda tidak dapat menggunakan menunggu di blok tangkapan .

Tips Dimulai dengan C# di Microsoft Visual Studio 2005, Anda dapat menggunakan tunggu di blok tangkapan .

Ringkasan dan langkah berikutnya

Pola memanggil metode asinkron yang kami tunjukkan di sini adalah yang paling sederhana untuk digunakan saat Anda memanggil API asinkron dalam penanganan aktivitas. Anda juga dapat menggunakan pola ini saat memanggil metode asinkron dalam metode yang ditimpa yang mengembalikan kekosongan atau Sub di Visual Basic.

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

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

Contoh dalam topik ini menghasilkan 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