async (C# Başvurusu)

asyncBir yöntem, lambda ifadesiveya anonim yöntemin zaman uyumsuz olduğunu belirtmek için değiştiricisini kullanın. Bu değiştiriciyi bir yöntem veya ifadede kullanırsanız, zaman uyumsuz bir yöntem olarak adlandırılır. Aşağıdaki örnek adlı bir zaman uyumsuz metodu tanımlar ExampleMethodAsync :

public async Task<int> ExampleMethodAsync()
{
    //...
}

Zaman uyumsuz programlamaya yeni başladıysanız veya zaman uyumsuz bir yöntemin, çağıranın iş parçacığını engellemeden uzun süre çalışan bir iş yapmak için await işlecini nasıl kullandığını anlamayın, zaman uyumsuz programlamada girişi zaman uyumsuz ve await ileokuyun. Aşağıdaki kod zaman uyumsuz bir yöntem içinde bulunur ve HttpClient.GetStringAsync yöntemini çağırır:

string contents = await httpClient.GetStringAsync(requestUrl);

Zaman uyumsuz bir yöntem, ilk ifadesine ulaşana dek zaman uyumlu await olarak çalışır ve bu noktada, beklenen görev tamamlanana kadar yöntem askıya alınır. Bu arada, denetim, bir sonraki bölümdeki örnekte gösterildiği gibi yöntemi çağırana döner.

asyncAnahtar sözcüğünün değiştirdiği Yöntem bir await ifade veya deyim içermiyorsa, yöntem zaman uyumlu olarak yürütülür. Bir derleyici uyarısı, deyimi içermeyen herhangi bir zaman uyumsuz metotlarda sizi uyarır await , çünkü bu durum bir hata gösteriyor olabilir. Bkz. Derleyici Uyarısı (düzey 1) CS4014.

Anahtar sözcüğü, async yalnızca bir metodu, bir lambda ifadesini veya anonim bir yöntemi değiştirdiğinde anahtar kelimedir. Tüm diğer bağlamlarda bu, tanımlayıcı olarak yorumlanır.

Örnek

Aşağıdaki örnek, zaman uyumsuz olay işleyicisi, StartButton_Click ve zaman uyumsuz bir yöntem arasındaki denetimin yapısını ve akışını gösterir ExampleMethodAsync . Zaman uyumsuz yöntemin sonucu bir Web sayfasının karakter sayısıdır. kod, Visual Studio oluşturduğunuz bir Windows Presentation Foundation (WPF) uygulaması veya Windows mağazası uygulaması için uygundur; uygulamayı ayarlamaya yönelik kod açıklamalarını inceleyin.

bu kodu, bir Windows Presentation Foundation (WPF) uygulaması veya bir Windows mağazası uygulaması olarak Visual Studio çalıştırabilirsiniz. Adlı bir düğme denetimine StartButton ve adlı TextBox denetimine ihtiyacınız vardır ResultsTextBox . Adları ve işleyiciyi şuna benzer 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 MainWindow. xaml. cs içindeki sınıfa yapıştırın.
  • System .net. http öğesine bir başvuru ekleyin.
  • usingSystem .net. http için bir yönerge ekleyin.

kodu bir Windows mağazası uygulaması olarak çalıştırmak için:

  • Bu kodu MainPage MainPage. xaml. cs içindeki sınıfa 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 bir görevi beklerken yürütülen kod hakkında daha fazla bilgi için bkz. Async ve await Ile zaman uyumsuz programlama. Benzer öğeleri kullanan tam bir konsol örneği için bkz. işlem 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>
  • void. async void yöntemler genellikle olay işleyicileri dışındaki kod için önerilmez çünkü çağıranlar await Bu yöntemlere izin vermez ve başarılı tamamlamayı veya hata koşullarını raporlamak için farklı bir mekanizma uygulamalıdır.
  • C# 7,0 ile başlayarak, erişilebilir bir yöntemi olan herhangi bir tür GetAwaiter . System.Threading.Tasks.ValueTask<TResult>Bu tür bir uygulama. NuGet paketi eklenerek kullanılabilir System.Threading.Tasks.Extensions .

Async yöntemi içindeherhangi bir ref veya Out parametresi bildiremez ve Başvuru dönüş değerinesahip olabilir, ancak bu parametrelere sahip yöntemleri çağırabilir.

Task<TResult>Metodun Return ifadesinde bir işlenen belirtiyorsa, zaman uyumsuz bir yöntemin dönüş türü olarak belirtirsiniz TResult . TaskYöntem tamamlandığında anlamlı bir değer döndürülmezse kullanırsınız. Diğer bir deyişle, yöntemine yapılan bir çağrı bir döndürür Task , ancak tamamlandığında, Task await sonucunu bekleyen tüm ifadeler Task void .

Dönüş türünü void öncelikle bu dönüş türü gerektiren olay işleyicilerini tanımlamak için kullanırsınız. voidDöndüren zaman uyumsuz bir yöntemi çağıran, bunu bekler ve yöntemin oluşturduğu özel durumları yakalayamaz.

C# 7,0 ' den başlayarak, GetAwaiter kodun performans açısından kritik bölümlerinde bellek ayırmalarını en aza indirmek için bir yöntemine sahip olan, genellikle bir değer türü olan başka bir tür döndürüyorsunuz.

Daha fazla bilgi ve örnek için bkz. zaman uyumsuz dönüş türleri.

Ayrıca bkz.