async (C# Başvurusu)async (C# Reference)

Bir yöntem, lambda ifadesiveya anonim yöntemin zaman uyumsuz olduğunu belirtmek için değiştiricisinikullanın.asyncUse the async modifier to specify that a method, lambda expression, or anonymous method is asynchronous. Bu değiştiriciyi bir yöntem veya ifadede kullanırsanız, zaman uyumsuz bir yöntemolarak adlandırılır.If you use this modifier on a method or expression, it's referred to as an async method. Aşağıdaki örnek adlı ExampleMethodAsyncbir zaman uyumsuz metodu tanımlar:The following example defines an async method named ExampleMethodAsync:

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

Zaman uyumsuz programlamaya yeni başladıysanız veya bir zaman uyumsuz yöntemin, uzun süre çalışan bir işi await çağıranın iş parçacığını engellemeden nasıl kullandığını anladıysanız, zaman uyumsuz programlama ile giriş zaman uyumsuz olarak okuyun ve await.If you're new to asynchronous programming or do not understand how an async method uses the await keyword to do potentially long-running work without blocking the caller’s thread, read the introduction in Asynchronous Programming with async and await. Aşağıdaki kod zaman uyumsuz bir yöntem içinde bulunur ve HttpClient.GetStringAsync yöntemini çağırır:The following code is found inside an async method and calls the HttpClient.GetStringAsync method:

string contents = await httpClient.GetStringAsync(requestUrl);  

Zaman uyumsuz bir yöntem, ilk await ifadesine ulaşana dek zaman uyumlu olarak çalışır ve bu noktada, beklenen görev tamamlanana kadar yöntem askıya alınır.An async method runs synchronously until it reaches its first await expression, at which point the method is suspended until the awaited task is complete. Bu arada, denetim, bir sonraki bölümdeki örnekte gösterildiği gibi yöntemi çağırana döner.In the meantime, control returns to the caller of the method, as the example in the next section shows.

async Anahtar 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.If the method that the async keyword modifies doesn't contain an await expression or statement, the method executes synchronously. Bir derleyici uyarısı, deyimi içermeyen await herhangi bir zaman uyumsuz metotlarda sizi uyarır, çünkü bu durum bir hata gösteriyor olabilir.A compiler warning alerts you to any async methods that don't contain await statements, because that situation might indicate an error. Bkz. Derleyici Uyarısı (düzey 1) CS4014.See Compiler Warning (level 1) CS4014.

async Anahtar sözcüğü, yalnızca bir metodu, bir lambda ifadesini veya anonim bir yöntemi değiştirdiğinde anahtar kelimedir.The async keyword is contextual in that it's a keyword only when it modifies a method, a lambda expression, or an anonymous method. Tüm diğer bağlamlarda bu, tanımlayıcı olarak yorumlanır.In all other contexts, it's interpreted as an identifier.

ÖrnekExample

Aşağıdaki örnek, zaman uyumsuz olay işleyicisi, StartButton_Clickve zaman uyumsuz bir ExampleMethodAsyncyöntem arasındaki denetimin yapısını ve akışını gösterir.The following example shows the structure and flow of control between an async event handler, StartButton_Click, and an async method, ExampleMethodAsync. Zaman uyumsuz yöntemin sonucu bir Web sayfasının karakter sayısıdır.The result from the async method is the number of characters of a web page. Kod, Visual Studio 'da oluşturduğunuz bir Windows Presentation Foundation (WPF) uygulamasına veya Windows Mağazası uygulamasına uygundur; uygulamayı ayarlamaya yönelik kod açıklamalarını inceleyin.The code is suitable for a Windows Presentation Foundation (WPF) app or Windows Store app that you create in Visual Studio; see the code comments for setting up the app.

Bu kodu, Visual Studio 'da bir Windows Presentation Foundation (WPF) uygulaması veya bir Windows Mağazası uygulaması olarak çalıştırabilirsiniz.You can run this code in Visual Studio as a Windows Presentation Foundation (WPF) app or a Windows Store app. Adlı StartButton bir düğme denetimine ve adlı ResultsTextBoxTextBox denetimine ihtiyacınız vardır.You need a Button control named StartButton and a Textbox control named ResultsTextBox. Adları ve işleyiciyi şuna benzer olacak şekilde ayarlamayı unutmayın:Remember to set the names and handler so that you have something like this:

<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:To run the code as a WPF app:

  • Bu kodu MainWindow MainWindow.xaml.cs içindeki sınıfa yapıştırın.Paste this code into the MainWindow class in MainWindow.xaml.cs.
  • System .net. http öğesine bir başvuru ekleyin.Add a reference to System.Net.Http.
  • System .net using . http için bir yönerge ekleyin.Add a using directive for System.Net.Http.

Kodu bir Windows Mağazası uygulaması olarak çalıştırmak için:To run the code as a Windows Store app:

  • Bu kodu MainPage MainPage.xaml.cs içindeki sınıfa yapıştırın.Paste this code into the MainPage class in MainPage.xaml.cs.
  • System .net. http ve System. Threading. Tasks için using yönergelerini ekleyin.Add using directives for System.Net.Http and System.Threading.Tasks.
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.For more information about tasks and the code that executes while waiting for a task, see Asynchronous Programming with async and await. Benzer öğeleri kullanan tam bir WPF örneği için bkz . İzlenecek yol: Async ve awaitkullanarak Web 'e erişme.For a full WPF example that uses similar elements, see Walkthrough: Accessing the Web by Using Async and Await.

Dönüş TürleriReturn Types

Zaman uyumsuz bir yöntem aşağıdaki dönüş türlerine sahip olabilir:An async method can have the following return types:

  • Task
  • Task<TResult>
  • void.void. async voidyö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.async void methods are generally discouraged for code other than event handlers because callers cannot await those methods and must implement a different mechanism to report successful completion or error conditions.
  • 7,0 ile C# başlayarak, erişilebilir GetAwaiter bir yöntemi olan herhangi bir tür.Starting with C# 7.0, any type that has an accessible GetAwaiter method. Bu System.Threading.Tasks.ValueTask<TResult> tür bir uygulama.The System.Threading.Tasks.ValueTask<TResult> type is one such implementation. NuGet paketi System.Threading.Tasks.Extensionseklenerek kullanılabilir.It is available by adding the NuGet package 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.The async method can't declare any in, ref or out parameters, nor can it have a reference return value, but it can call methods that have such parameters.

Metodun Task<TResult> Return ifadesindeTResultbir işlenen belirtiyorsa, zaman uyumsuz bir yöntemin dönüş türü olarak belirtirsiniz.You specify Task<TResult> as the return type of an async method if the return statement of the method specifies an operand of type TResult. Yöntem tamamlandığında Task anlamlı bir değer döndürülmezse kullanırsınız.You use Task if no meaningful value is returned when the method is completed. Diğer bir deyişle, yöntemine yapılan bir Taskçağrı bir döndürür, ancak Task tamamlandığında, Task sonucunu voidbekleyen tüm await ifadeler.That is, a call to the method returns a Task, but when the Task is completed, any await expression that's awaiting the Task evaluates to void.

Dönüş türünü öncelikle void bu dönüş türü gerektiren olay işleyicilerini tanımlamak için kullanırsınız.You use the void return type primarily to define event handlers, which require that return type. Döndüren zaman uyumsuz bir voidyöntemi çağıran, bunu bekler ve yöntemin oluşturduğu özel durumları yakalayamaz.The caller of a void-returning async method can't await it and can't catch exceptions that the method throws.

7,0 ' C# den başlayarak, kodun performans açısından kritik bölümlerinde bellek ayırmalarını en aza indirmek için bir GetAwaiter yöntemine sahip olan, genellikle bir değer türü olan başka bir tür döndürüyorsunuz.Starting with C# 7.0, you return another type, typically a value type, that has a GetAwaiter method to minimize memory allocations in performance-critical sections of code.

Daha fazla bilgi ve örnek için bkz. zaman uyumsuz dönüş türleri.For more information and examples, see Async Return Types.

Ayrıca bkz.See also