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ı ExampleMethodAsynczaman 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 ExampleMethodAsyncarası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ı StartButtonResultsTextBoxbir 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="&lt;Enter a URL&gt;" 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 kullanamaz await 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ür System.Threading.Tasks.ValueTask<TResult> , böyle bir uygulamadır. NuGet paketi System.Threading.Tasks.Extensionseklenerek 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ü TResultolarak 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 Taskdöndürür, ancak Task tamamlandığında, öğesini bekleyen Task tüm await ifadeler olarak voiddeğ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.

Ayrıca bkz.