Async katmanı
Async/await ve Task kullanarak veri akışı kurarsın.
Async katmanı
Şimdi komutu async yapacağız. ICommand.Execute() yerine Task<string> ExecuteAsync() kullanırız. Böylece komut ağ çağrısı, dosya okuma gibi uzun işler yapabilir; çağıran iş parçacığını bloklamaz.
Main de async olur: static async Task Main(). Çağrı await cmd.ExecuteAsync() ile beklenir. Bu küçük değişiklik, ileride gerçek async işleri (örneğin ağdan veri çekme) eklemeye zemin hazırlar.
async Task Main
C# 7.1'den beri Main async olabilir: static async Task Main(). Bu, await kullanmayı sağlar; GetAwaiter().GetResult() gibi hantal geçici çözümlere gerek kalmaz.
Bir async metot içinde await her çağrıyı bekler. HelloCommand.ExecuteAsync() içinde await Task.CompletedTask zaten tamamlanmış bir Task'ı bekler; bu, gerçek bir async işin yerini tutan iskelet koddur. İleride burayı ağ veya dosya çağrısıyla değiştirebilirsin.
Uygulama Komutu async yap
ICommand arayüzünü async yap: Task<string> ExecuteAsync() metodu olsun. HelloCommand.ExecuteAsync() async Task<string> imzasıyla await Task.CompletedTask çağrısı yapsın ve "Merhaba" döndürsün. Main'i static async Task Main() yap ve await cmd.ExecuteAsync() ile sonucu yazdır.
Örnek çözümü göster
interface ICommand { Task<string> ExecuteAsync(); } yaz. class HelloCommand : ICommand { public async Task<string> ExecuteAsync() { await Task.CompletedTask; return "Merhaba"; } } yaz. Main'i: static async Task Main() { var cmd = new HelloCommand(); Console.WriteLine(await cmd.ExecuteAsync()); } yap.
Örnek çözüm:
using System;
using System.Threading.Tasks;
interface ICommand
{
Task<string> ExecuteAsync();
}
class HelloCommand : ICommand
{
public async Task<string> ExecuteAsync()
{
await Task.CompletedTask;
return "Merhaba";
}
}
class Program
{
static async Task Main()
{
var cmd = new HelloCommand();
Console.WriteLine(await cmd.ExecuteAsync());
}
}
Kendini test et
-
Async komut metodu hangi dönüş türüne sahip olmalı?
- string
- Task<string>
- void
- int
Cevabı göster
Task<string> — Doğru. Task<string> async metottan string sonucu beklemeyi sağlar.
-
Async Main bildirimini tamamla
static ____ Task Main() { Console.WriteLine(await cmd.ExecuteAsync()); }Cevabı göster
static async Task Main() { Console.WriteLine(await cmd.ExecuteAsync()); } -
Async kavramlarını eşleştir
- Task<string>
- Async dönüş türü
- await
- Task'ı bekler
- async Task Main
- Async giriş noktası
- Task.CompletedTask
- Zaten tamamlanmış Task