Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Windows számos aszinkron API-t tartalmaz annak biztosítása érdekében, hogy az alkalmazás rugalmas maradjon, ha olyan munkát végez, amely hosszabb időt vehet igénybe. Ez a témakör az aszinkron metódusok C#-ban vagy Microsoft Visual Basic való használatát ismerteti.
Az aszinkron API-k megakadályozzák, hogy az alkalmazásnak meg kelljen várnia a nagyobb műveletek befejeződését, mielőtt folytatná a végrehajtást. Például egy olyan alkalmazás, amely adatokat tölt le az internetről, több másodpercet is igénybe vehet, amíg az információ megérkezik. Ha szinkron módszerrel kéri le az adatokat, az alkalmazás le lesz tiltva, amíg a metódus vissza nem tér. Az alkalmazás nem válaszol a felhasználói interakcióra, és mivel úgy tűnik, hogy nem reagál, a felhasználó frusztrálttá válhat. Az aszinkron API-k biztosításával Windows biztosíthatja, hogy az alkalmazás rugalmasan reagáljon a felhasználóra, amikor hosszú műveleteket hajt végre.
A Windows aszinkron API-k többsége nem rendelkezik szinkron megfelelőkkel, ezért mindenképpen tisztában kell lennie azzal, hogyan használhatja az aszinkron API-kat C# vagy Visual Basic az Windows alkalmazásban. Itt bemutatjuk, hogyan hívhatja meg az aszinkron API-kat.
Aszinkron API-k használata
Konvenció szerint az aszinkron metódusok "Async" végződésű neveket kapnak. Általában aszinkron API-kat hív meg egy felhasználó műveletére válaszul, például amikor a felhasználó egy gombra kattint. Az aszinkron metódus eseménykezelőben való meghívása az aszinkron API-k használatának egyik legegyszerűbb módja. Itt a várakozás operátort használjuk példaként.
Tegyük fel, hogy van egy alkalmazás, amely egy adott helyről listázza a blogbejegyzések címét. Az alkalmazásnak van egy gombja , amellyel a felhasználó rákattint a címek lekéréséhez. A címek egy TextBlock-ban jelennek meg. Amikor a felhasználó rákattint a gombra, fontos, hogy az alkalmazás válaszkész maradjon, amíg a blog webhelyéről várja az információkat. Ennek a válaszkészségnek a biztosítása érdekében Windows egy aszinkron metódust, a SyndicationClient.RetrieveFeedAsync-t biztosít a hírcsatorna letöltéséhez.
Az alábbi példában a blogbejegyzések listáját egy blogból szerzi be a SyndicationClient.RetrieveFeedAsync aszinkron metódus meghívásával, és várja az eredményt.
// 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
Ebben a példában van néhány fontos dolog. Először a sor SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) a Várakozás operátort használja a RetrieveFeedAsync aszinkron metódus hívásával. Az await operátorra úgy is tekinthet, mint ami azt jelzi a fordítónak, hogy egy aszinkron metódust hív meg, aminek hatására a fordító némi extra munkát végez el, hogy ezt ne Önnek kelljen. Ezután az eseménykezelő deklarációja tartalmazza az aszinkron kulcsszót. Ezt a kulcsszót minden olyan metódus metódus deklarációjában meg kell adnia, amelyben a vár operátort használja.
Ebben a témakörben nem sok részletet fogunk megtudni arról, hogy mit csinál a fordító a váró operátorral, de vizsgáljuk meg, hogy az alkalmazás mit tesz, hogy aszinkron és rugalmas legyen. Gondolja át, mi történik, ha szinkron kódot használ. Tegyük fel például, hogy van egy szinkron metódus.SyndicationClient.RetrieveFeed (Nincs ilyen metódus, de képzelje el, hogy van.) Ha az alkalmazás a(z) SyndicationFeed feed = client.RetrieveFeed(feedUri) sort tartalmazná a(z) SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) helyett, az alkalmazás végrehajtása leállna, amíg a(z) RetrieveFeed visszatérési értéke elérhetővé nem válik. Miközben az alkalmazás megvárja a metódus befejezését, nem tud válaszolni más eseményekre, például egy másik Click-eseményre. Vagyis az alkalmazás blokkolva lesz, amíg a RetrieveFeed vissza nem tér.
Ha azonban meghívja client.RetrieveFeedAsync, a metódus elindítja a lekérést, és azonnal visszatér. Ha a(z) RetrieveFeedAsync metódust az await kulcsszóval használja, az alkalmazás ideiglenesen kilép az eseménykezelőből. Ezután feldolgozhat más eseményeket, miközben a RetrieveFeedAsync aszinkron módon hajtja végre. Így az alkalmazás rugalmasan reagál a felhasználóra. Amikor a RetrieveFeedAsync befejeződik, és a SyndicationFeed elérhető, az alkalmazás lényegében újra megismétli az eseménykezelőt, ahol abbahagyta, utána SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri)és befejezi a metódus többi részét.
A váró operátor használatakor az a jó, hogy a kód nem különbözik a kód megjelenésétől, ha a képzeletbeli RetrieveFeed metódust használta. Az aszinkron kódot c# vagy Visual Basic a várakozási operátor nélkül is meg lehet írni, de az eredményül kapott kód általában kihangsúlyozza az aszinkron végrehajtás mechanikát. Így az aszinkron kód nehezen írható, nehezen érthető és nehezen karbantartható. A váró operátor használatával a kód összetettsége nélkül élvezheti az aszinkron alkalmazások előnyeit.
Aszinkron API-k típusainak és eredményeinek visszaadása
Ha követte a RetrieveFeedAsync hivatkozását, észrevehette, hogy a RetrieveFeedAsync visszatérési típusa nem SyndicationFeed. Ehelyett a visszatérési típus a következő IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>: . A nyers szintaxisból megtekintett aszinkron API egy olyan objektumot ad vissza, amely tartalmazza az eredményt. Bár az aszinkron metódusokat gyakran és néha hasznosnak tartjuk, a várt operátor valójában a metódus visszatérési értékén működik, nem a metóduson. Amikor alkalmazod a await operátort, azt kapod vissza, ami a metódus által visszaadott objektumon meghívott GetResult eredménye. A példában a SyndicationFeed a RetrieveFeedAsync.GetResult() eredménye.
Ha aszinkron metódust használ, megvizsgálhatja az aláírást, hogy lássa, mit kap vissza a metódusból visszaadott értékre való várakozás után. Az összes aszinkron API az alábbi típusok egyikét adja vissza:
- IAsyncOperation<TResult>
- IAsyncOperationWithProgress<TResult, TProgress>
- IAsyncAction
- IAsyncActionWithProgress<TProgress>
Az aszinkron metódus eredménytípusa megegyezik a TResult típusparaméterrel. Az eredmény nélküli TResult típusok nem rendelkeznek eredménnyel. Gondolhat arra, hogy az eredmény érvénytelen. A Visual Basicben a Sub eljárás egyenértékű egy void visszatérési típusú metódussal.
Az alábbi táblázat példákat ad az aszinkron metódusokra, és felsorolja az egyes metódusok visszatérési típusát és eredménytípusát.
| Aszinkron metódus | Visszatérési típus | Eredmény típusa |
|---|---|---|
| SyndicationClient.RetrieveFeedAsync | IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> | SyndicationFeed |
| FileOpenPicker.PickSingleFileAsync | IAsyncOperation<StorageFile> | Tárolófájl |
| XmlDocument.SaveToFileAsync | IAsyncAction | void |
| InkStrokeContainer.LoadAsync | IAsyncActionWithProgress<UInt64> | void |
| DataReader.LoadAsync | DataReaderLoadOperation, egy egyéni eredményosztály, amely az IAsyncOperation<UInt32-t> implementálja | UInt32 |
Note
FileOpenPicker és más kiválasztó API-khoz ablakkezelő (HWND) inicializálás szükséges a WinUI 3 asztali alkalmazásokban. Mielőtt meghívja a PickSingleFileAsync elemet, hívja meg a WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd) elemet, ahol a hwnd a WindowNative.GetWindowHandle(this) elemből származik. Lásd a következőt: Ablakkezelőt (HWND) igénylő WinUI 3-választó API-k megjelenítése.
A Windows-alkalmazásokhoz készült .NET-ben definiált aszinkron metódusok visszatérési típusa Task vagy Task<TResult>. A feladatot visszaadó metódusok hasonlóak az IAsyncAction aszinkron metódusokhoz. Az aszinkron módszer eredménye minden esetben érvénytelen. A Feladat<TResult> visszatérési típusa hasonló az IAsyncOperation<TResult> típushoz, mivel az aszinkron metódus eredménye a feladat futtatásakor ugyanaz a típustípus, mint a TResult típusparaméter.
Hibák kezelése
Ha a várakozás operátort használja az eredmények aszinkron metódusból való lekéréséhez, a try/catch blokkot használhatja az aszinkron metódusokban előforduló hibák kezelésére, ugyanúgy, mint a szinkron metódusok esetében. Az előző példa körbefuttatja a RetrieveFeedAsync metódust, és egy próba/fogási blokkban várja meg a műveletet a hibák kezelésére kivétel esetén.
Ha az aszinkron metódusok más aszinkron metódusokat hívnak meg, akkor bármely aszinkron metódusban keletkező kivétel továbbterjed a külső metódusokhoz. Ez azt jelenti, hogy a legkülső metódusban is elhelyezhet egy try/catch blokkot a beágyazott aszinkron metódusok hibáinak elkapására. Ez is hasonló a szinkron metódusok kivételeinek fogásához. Azonban nem használhatja az await kulcsszót a catch blokkban.
Tip
Használhatja az await kulcsszót a catch és finally blokkokban (a C# 6.0 óta támogatott).
Összefoglalás és következő lépések
Az itt látható aszinkron metódus meghívásának mintája a legegyszerűbb, ha eseménykezelőben aszinkron API-kat hív meg. Ezt a mintát akkor is alkalmazhatja, amikor egy aszinkron metódust hív meg egy olyan felülírt metódusban, amely void típust ad vissza, illetve Visual Basicben Sub.
Amikor aszinkron metódusokkal találkozik, fontos megjegyezni:
- Konvenció szerint az aszinkron metódusok "Async" végződésű neveket kapnak.
- A várakozási operátort használó bármely metódusnak meg kell jelölnie a deklarációját az aszinkron kulcsszóval.
- Amikor egy alkalmazás megkeresi a várakozási operátort, az alkalmazás továbbra is reagál a felhasználói interakcióra, miközben az aszinkron metódus végrehajtja.
- Az aszinkron metódus által visszaadott értékre várva egy objektumot ad vissza, amely tartalmazza az eredményt. A legtöbb esetben a visszatérési értékben található eredmény hasznos, nem maga a visszatérési érték. Az eredményben található érték típusát az aszinkron metódus visszatérési típusával találja meg.
- Az aszinkron API-k és aszinkron minták használata gyakran az alkalmazás válaszkészségének javítására szolgál.
Az ebben a témakörben szereplő példa az alábbihoz hasonló szöveget ad ki.
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
Windows developer