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ı 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 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_ClickExampleMethodAsync. 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ı 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 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 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 . 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ğinden await 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ü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önteminin return deyimi türünde bir işlenen belirtiyorsa, zaman uyumsuz bir 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 voidolarak 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 voidzaman 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.

Ayrıca bkz.