async (C# Başvurusu)
Bir yöntemin async
, lambda ifadesinin veya anonim yöntemin zaman uyumsuz olduğunu belirtmek için değiştiriciyi kullanın. Bu değiştiriciyi bir yöntem veya ifadede kullanırsanız, zaman uyumsuz yöntem olarak adlandırılır. Aşağıdaki örnek adlı ExampleMethodAsync
zaman uyumsuz bir yöntemi tanımlar:
public async Task<int> ExampleMethodAsync()
{
//...
}
Zaman uyumsuz programlama konusunda yeniyseniz veya zaman uyumsuz bir yöntemin çağıranın iş parçacığını await
engellemeden uzun süre çalışma olasılığı olan işleri yapmak için işlecini nasıl kullandığını anlamıyorsanız, zaman uyumsuz programlama ile zaman uyumsuz programlama ve bekleme bölümündeki girişi okuyun. Aşağıdaki kod zaman uyumsuz bir yöntemin içinde bulunur ve yöntemini çağırır HttpClient.GetStringAsync :
string contents = await httpClient.GetStringAsync(requestUrl);
Zaman uyumsuz bir yöntem, ilk await
ifadesine ulaşana kadar zaman uyumlu olarak çalışır ve bu noktada yöntem, beklenen görev tamamlanana kadar askıya alınır. Bu arada, denetim, bir sonraki bölümdeki örnekte gösterildiği gibi yöntemi çağırana döner.
Anahtar sözcüğün async
değiştirdiği yöntem bir await
ifade veya deyim içermiyorsa, yöntem zaman uyumlu olarak yürütülür. Derleyici uyarısı, deyim içermeyen zaman uyumsuz yöntemler await
için sizi uyarır, çünkü bu durum hataya işaret edebilir. Bkz. Derleyici Uyarısı (düzey 1) CS4014.
anahtar async
sözcüğü bağlamsaldır ve yalnızca bir yöntemi, lambda ifadesini veya anonim bir yöntemi değiştirdiğinde bir anahtar sözcüktür. Tüm diğer bağlamlarda bu, tanımlayıcı olarak yorumlanır.
Örnek
Aşağıdaki örnekte, zaman uyumsuz olay işleyicisi ile zaman uyumsuz yöntemi ExampleMethodAsync
arasındaki denetim yapısı ve akışı gösterilmektedirStartButton_Click
. Zaman uyumsuz yönteminden elde edilen sonuç, bir web sayfasının karakter sayısıdır. Kod, Visual Studio'da oluşturduğunuz bir Windows Presentation Foundation (WPF) uygulaması veya Windows Mağazası uygulaması için uygundur; uygulamayı ayarlamak için kod açıklamalarına bakın.
Bu kodu Visual Studio'da Windows Presentation Foundation (WPF) uygulaması veya Windows Mağazası uygulaması olarak çalıştırabilirsiniz. adlı bir Düğme denetimine ve adlı StartButton
ResultsTextBox
bir Textbox denetimine ihtiyacınız vardır. Adları ve işleyiciyi şöyle bir şeye sahip olacak şekilde ayarlamayı unutmayın:
<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
Click="StartButton_Click" Name="StartButton"/>
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"
Text="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
Kodu WPF uygulaması olarak çalıştırmak için:
- Bu kodu MainWindow.xaml.cs dosyasındaki sınıfına
MainWindow
yapıştırın. - System.Net.Http'ye başvuru ekleyin.
- System.Net.Http için bir
using
yönerge ekleyin.
Kodu bir Windows Mağazası uygulaması olarak çalıştırmak için:
- Bu kodu MainPage.xaml.cs dosyasındaki sınıfına
MainPage
yapıştırın. - System.Net.Http ve System.Threading.Tasks için using yönergelerini ekleyin.
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
// ExampleMethodAsync returns a Task<int>, which means that the method
// eventually produces an int result. However, ExampleMethodAsync returns
// the Task<int> value as soon as it reaches an await.
ResultsTextBox.Text += "\n";
try
{
int length = await ExampleMethodAsync();
// Note that you could put "await ExampleMethodAsync()" in the next line where
// "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
// would not see the global side effect of ExampleMethodAsync setting the text.
ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length);
}
catch (Exception)
{
// Process the exception if one occurs.
}
}
public async Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
// After the following return statement, any method that's awaiting
// ExampleMethodAsync (in this case, StartButton_Click) can get the
// integer result.
return exampleInt;
}
// The example displays the following output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
Önemli
Görevler ve görev beklerken yürütülen kod hakkında daha fazla bilgi için bkz. Async ve await ile zaman uyumsuz programlama. Benzer öğeler kullanan tam bir konsol örneği için bkz . Zaman uyumsuz görevleri tamamlandıklarında işleme (C#).
Dönüş Türleri
Zaman uyumsuz bir yöntem aşağıdaki dönüş türlerine sahip olabilir:
- Task
- Task<TResult>
- geçersiz.
async void
yöntemleri genellikle olay işleyicileri dışındaki kodlar için önerilmez çünkü çağıranlar bu yöntemleri kullanamazawait
ve başarılı tamamlama veya hata koşullarını bildirmek için farklı bir mekanizma uygulamalıdır. - Erişilebilir
GetAwaiter
bir yöntemi olan herhangi bir tür. TürSystem.Threading.Tasks.ValueTask<TResult>
, böyle bir uygulamadır. NuGet paketiSystem.Threading.Tasks.Extensions
eklenerek kullanılabilir.
Zaman uyumsuz yöntem herhangi bir in, ref veya out parametresini bildiremez veya bir başvuru dönüş değerine sahip olamaz, ancak bu tür parametrelere sahip yöntemleri çağırabilir.
Yöntemin return deyimi türünde bir işlenen belirtiyorsa, zaman uyumsuz yöntemin dönüş türü TResult
olarak belirtirsinizTask<TResult>
. Yöntem tamamlandığında anlamlı bir değer döndürülmezse kullanırsınız Task
. Yani, yöntemine yapılan bir çağrı bir Task
döndürür, ancak Task
tamamlandığında, öğesini bekleyen Task
tüm await
ifadeler olarak void
değerlendirilir.
Dönüş türünü öncelikle bu dönüş türünü gerektiren olay işleyicilerini tanımlamak için kullanırsınız void
. -returning zaman uyumsuz yönteminin void
çağıranı onu bekleyemiyor ve yöntemin attığı özel durumları yakalayamıyor.
Kodun performans açısından kritik bölümlerinde bellek ayırmalarını en aza indirmek için bir yöntemi olan başka bir tür (genellikle bir GetAwaiter
değer türü) döndürürsiniz.
Daha fazla bilgi ve örnek için bkz. Zaman Uyumsuz Dönüş Türleri.