Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows, uygulamanızın uzun zaman alabilecek şekilde çalıştığında yanıt vermeye devam etmesini sağlamak için birçok zaman uyumsuz API içerir. Bu konuda C# veya Microsoft Visual Basic zaman uyumsuz yöntemlerin nasıl kullanılacağı açıklanmaktadır.
Zaman uyumsuz API'ler, yürütmeye devam etmeden önce uygulamanızın büyük işlemlerin tamamlanmasını beklemesini engeller. Örneğin, İnternet'ten bilgi indiren bir uygulama, bilgileri beklerken birkaç saniye harcayabilir. Bilgileri almak için zaman uyumlu bir yöntem kullanırsanız, yöntem dönene kadar uygulama engellenir. Uygulama kullanıcı etkileşimine yanıt vermez ve yanıt vermiyor gibi göründüğünden kullanıcı hayal kırıklığına uğrayabilir. zaman uyumsuz API'ler sağlayarak Windows uygulamanızın uzun işlemler gerçekleştirirken kullanıcıya yanıt vermeye devam etmesini sağlamaya yardımcı olur.
Windows'daki zaman uyumsuz API'lerin çoğunun zaman uyumlu karşılıkları yoktur, bu nedenle Windows uygulamanızda C# veya Visual Basic ile zaman uyumsuz API'lerin nasıl kullanılacağını anladığınızdan emin olmanız gerekir. Burada zaman uyumsuz API'lerin nasıl çağrılacaklarını göstereceğiz.
Zaman uyumsuz API'leri kullanma
Kural gereği, zaman uyumsuz yöntemlere "Async" ile biten adlar verilir. Genellikle kullanıcının bir düğmeye tıklaması gibi bir eyleme yanıt olarak zaman uyumsuz API'leri çağırırsınız. Bir olay işleyicisinde zaman uyumsuz bir yöntemi çağırmak, zaman uyumsuz API'leri kullanmanın en basit yollarından biridir. Burada await işlecini örnek olarak kullanacağız.
Belirli bir konumdaki blog gönderilerinin başlıklarını listeleyen bir uygulamanız olduğunu varsayalım. Uygulamada, kullanıcının başlıkları almak için tıkladığı bir Düğme vardır. Başlıklar TextBlock içinde görüntülenir. Kullanıcı düğmeye tıkladığında, uygulamanın blog web sitesindeki bilgileri beklerken yanıt vermeye devam ediyor olması önemlidir. Bu yanıt hızını sağlamak için Windows akışı indirmek için SyndicationClient.RetrieveFeedAsync adlı zaman uyumsuz bir yöntem sağlar.
Buradaki örnek, SyndicationClient.RetrieveFeedAsync adlı zaman uyumsuz yöntemini çağırarak ve sonucu bekleyerek blogdan blog gönderilerinin listesini alır.
// 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
Bu örnekle ilgili birkaç önemli şey vardır. İlk olarak, SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) satırı, zaman uyumsuz RetrieveFeedAsync yöntemine yapılan çağrıyla await işlecini kullanır.
Await işlecini, derleyiciye zaman uyumsuz bir yöntem çağırdığınızdan söz etmek olarak düşünebilirsiniz. Bu da derleyicinin sizin yapmanız gerekmeyen bazı ek işler gerçekleştirmesine neden olur. Ardından, olay işleyicisinin bildirimi async anahtar sözcüğünü içerir. Await işlecini kullandığınız herhangi bir yöntemin yöntem bildirimine bu anahtar sözcüğü eklemeniz gerekir.
Bu konu başlığında, derleyicinin await işleciyle ne yaptığına ilişkin birçok ayrıntıya girmeyeceğiz, ancak uygulamanızın zaman uyumsuz ve duyarlı olması için neler yaptığını inceleyelim. Zaman uyumlu kod kullandığınızda ne olacağını göz önünde bulundurun. Örneğin, eşzamanlı olan adlı SyndicationClient.RetrieveFeed bir yöntem bulunduğunu varsayalım. (Böyle bir yöntem yoktur, ancak olduğunu düşünün.) Uygulamanızda SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) yerine SyndicationFeed feed = client.RetrieveFeed(feedUri) satırı bulunsaydı, RetrieveFeed öğesinin dönüş değeri kullanılabilir olana kadar uygulamanın yürütülmesi dururdu. Uygulamanız yöntemin tamamlanmasını beklerken, başka bir Tıklama olayı gibi diğer olaylara yanıt veremiyor. Yani, RetrieveFeed tamamlanana kadar uygulamanız engellenir.
Ancak client.RetrieveFeedAsync yöntemini çağırırsanız, yöntem alma işlemini başlatır ve hemen döner.
RetrieveFeedAsync ile await kullandığınızda, uygulama geçici olarak olay işleyiciden çıkar. Daha sonra RetrieveFeedAsync zaman uyumsuz olarak yürütülürken diğer olayları işleyebilir. Bu, uygulamanın kullanıcıya yanıt vermesini sağlar.
RetrieveFeedAsync tamamlandığında ve SyndicationFeed kullanıma hazır olduğunda, uygulama özünde SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) sonrasında olay işleyicisine kaldığı yerden yeniden girer ve yöntemin geri kalanını tamamlar.
await işlecini kullanmanın güzel yanı, kodun, hayali RetrieveFeed yöntemini kullansaydınız nasıl görünecekse ondan çok farklı görünmemesidir. C# veya Visual Basic'de await işleci olmadan zaman uyumsuz kod yazmanın yolları vardır, ancak sonuçta elde edilen kod zaman uyumsuz olarak yürütme mekaniğine vurgu yapmaya eğilimlidir. Bu, zaman uyumsuz kodu yazmayı, anlaşılmasını ve bakımını zor hale getirir.
await işlecini kullanarak kodunuzu karmaşık hale getirmeden zaman uyumsuz bir uygulamanın avantajlarından yararlanırsınız.
Zaman uyumsuz API'lerin türlerini ve sonuçlarını döndürme
RetrieveFeedAsync bağlantısını izlediyseniz RetrieveFeedAsync dönüş türünün SyndicationFeed olmadığını fark etmiş olabilirsiniz. Bunun yerine, dönüş türü IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>'dür. Ham sözdizimi açısından bakıldığında, eşzamansız bir API sonucu kendi içinde barındıran bir nesne döndürür. Zaman uyumsuz bir yöntemin beklenebilir olduğunu düşünmek yaygın ve bazen yararlı olsa da await işleci aslında yöntem üzerinde değil yöntemin dönüş değeri üzerinde çalışır.
await işlecini uyguladığınızda, elde ettiğiniz sonuç, yöntemi tarafından döndürülen nesnede GetResult çağrısının sonucudur. Örnekte SyndicationFeed , RetrieveFeedAsync.GetResult() sonucunun sonucudur.
Zaman uyumsuz bir yöntem kullandığınızda, yönteminden döndürülen değeri bekledikten sonra ne elde ettiğinizi görmek için imzayı inceleyebilirsiniz. Tüm zaman uyumsuz API'ler aşağıdaki türlerden birini döndürür:
- IAsyncOperation<TResult>
- IAsyncOperationWithProgress<TResult, TProgress>
- IAsyncAction
- IAsyncActionWithProgress<TProgress>
Zaman uyumsuz bir yöntemin sonuç türü tür parametresiyle TResult aynıdır.
TResult olmayan türlerin sonucu yoktur.
Sonucun geçersiz olduğunu düşünebilirsiniz. Visual Basic'te bir Sub prosedürü, void geri dönüş türüne sahip bir yöntemle eşdeğerdir.
Buradaki tablo zaman uyumsuz yöntemlere örnekler verir ve her birinin dönüş türünü ve sonuç türünü listeler.
| Eşzamansız yöntem | Dönüş türü | Sonuç türü |
|---|---|---|
| SyndicationClient.RetrieveFeedAsync | IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> | SyndicationFeed |
| FileOpenPicker.PickSingleFileAsync | IAsyncOperation<StorageFile> | DepolamaDosyası |
| XmlDocument.SaveToFileAsync | IAsyncAction | void |
| InkStrokeContainer.LoadAsync | IAsyncActionWithProgress<UInt64> | void |
| DataReader.LoadAsync | DataReaderLoadOperation, IAsyncOperation<UInt32> uygulayan özel bir sonuç sınıfı | UInt32 |
Note
FileOpenPicker ve diğer seçici API'leri, WinUI 3 masaüstü uygulamalarında pencere tutamacını (HWND) başlatmayı gerektirir.
PickSingleFileAsync çağrılmadan önce, hwnd'nin WindowNative.GetWindowHandle(this)'ten geldiği durumda WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd) çağrısını yapın. Bkz. Pencere tanıtıcısı (HWND) gerektiren WinUI 3 seçici API'lerini görüntüleme.
Windows uygulamaları için .NET'te tanımlanan zaman uyumsuz yöntemler, Task veya Task<TResult> dönüş türüne sahiptir.
Task döndüren yöntemler, IAsyncAction döndüren eşzamansız yöntemlere benzer. Her durumda, zaman uyumsuz yöntemin sonucu geçersizdir.
Task<TResult> dönüş türü, görev çalıştırıldığında zaman uyumsuz yöntemin sonucunun TResult tür parametresiyle aynı türde olması bakımından IAsyncOperation<TResult> türüne benzerdir.
Hataları işleme
Zaman uyumsuz bir yöntemden sonuçları almak için await işlecini kullandığınızda, zaman uyumsuz yöntemlerde olduğu gibi zaman uyumsuz yöntemlerde oluşan hataları işlemek için bir try/catch bloğu kullanabilirsiniz. Önceki örnek, bir özel durum oluştuğunda hataları işlemek için Bir try/catch bloğunda RetrieveFeedAsync yöntemini ve await işlemini sarmalar.
Eşzamansız yöntemler diğer eşzamansız yöntemleri çağırdığında, özel durum oluşturan herhangi bir eşzamansız yöntemden kaynaklanan özel durum dış yöntemlere iletilir. Bu, iç içe zaman uyumsuz yöntemlerin hatalarını yakalamak için en dış yönteme bir try/catch bloğu yerleştirebileceğiniz anlamına gelir. Yine, bu da eşzamanlı yöntemlerde özel durumları yakalama şeklinize benzer. Ancak yakalama bloğunda await komutunu kullanamazsınız.
Tavsiye
C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) ile başlayarak yakalama bloğunda await kullanabilirsiniz.
Özet ve sonraki adımlar
Burada gösterdiğimiz zaman uyumsuz bir yöntemi çağırma deseni, bir olay işleyicisinde zaman uyumsuz API'leri çağırdığınızda kullanılacak en basit yöntemdir. Geçersiz kılınan bir yöntemde, void veya Visual Basic'te Sub döndüren zaman uyumsuz bir yöntemi çağırdığınızda da bu deseni kullanabilirsiniz.
Zaman uyumsuz yöntemlerle karşılaştığınızda şunları anımsamak önemlidir:
- Kural gereği, zaman uyumsuz yöntemlere "Async" ile biten adlar verilir.
- await işlecini kullanan herhangi bir yöntemin bildiriminin zaman uyumsuz anahtar sözcükle işaretlenmiş olması gerekir.
- Bir uygulama await işlecini bulduğunda, zaman uyumsuz yöntem yürütülürken uygulama kullanıcı etkileşimine yanıt vermeye devam eder.
- Bir asenkron yöntem tarafından döndürülen değeri beklemek, sonucu içeren bir nesne döndürür. Çoğu durumda, dönüş değerinin içinde yer alan sonuç, dönüş değerinin kendisi değil yararlı olan sonuç olur. Async yöntemin dönüş türüne bakarak sonuçta bulunan değerin türünü bulabilirsiniz.
- Zaman uyumsuz API'leri ve zaman uyumsuz desenleri kullanmak genellikle uygulamanızın yanıt hızını artırmanın bir yoludur.
Bu konudaki örnekte şuna benzer bir metin çıktısı verilmiştir.
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