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, buna zaman uyumsuz yöntem denir. 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 await
iş parçacığını engellemeden uzun süre çalışan olası işleri yapmak için işlecini nasıl kullandığını anlamıyorsanız, zaman uyumsuz programlamada zaman uyumsuz programlamaya giriş ve bekleme konularını okuyun. Aşağıdaki kod zaman uyumsuz bir yöntem içinde bulunur ve yöntemini çağırır HttpClient.GetStringAsync :
string contents = await httpClient.GetStringAsync(requestUrl);
Zaman uyumsuz yöntem, ilk await
ifadesine ulaşana kadar zaman uyumlu bir şekilde ç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
konusunda sizi uyarır çünkü bu durum bir hataya işaret edebilir. Bkz. Derleyici Uyarısı (düzey 1) CS4014.
anahtar async
sözcüğü, yalnızca bir yöntemi, lambda ifadesini veya anonim bir yöntemi değiştirdiğinde anahtar sözcük olması için bağlamsaldı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 bir yöntem arasındaki denetim yapısı ve akışı gösterilmektedirStartButton_Click
ExampleMethodAsync
. Zaman uyumsuz yönteminden elde edilen sonuç, 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 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 sınıfına
MainPage
yapıştırın. - System.Net.Http ve System.Threading.Tasks için yönergeler ekleyin
using
.
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 . Zaman uyumsuz ve await ile zaman uyumsuz programlama. Benzer öğelerin kullanıldığı tam 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
çağıranlar bu yöntemleri gerçekleştiremediğindenawait
ve başarılı tamamlama veya hata koşullarını raporlamak için farklı bir mekanizma uygulaması gerektiğinden, yöntemler genellikle olay işleyicileri dışındaki kodlar için önerilmez. - 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önteminin return deyimi türünde bir işlenen belirtiyorsa, zaman uyumsuz bir 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 void
olarak 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
. -dönen bir void
zaman uyumsuz yöntemi ç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 GetAwaiter
tür (genellikle bir değer türü) döndürürsiniz.
Daha fazla bilgi ve örnek için bkz . Zaman Uyumsuz Dönüş Türleri.