Errore del compilatore CS4009
"Type.Method": un punto di ingresso non può essere contrassegnato con il modificatore async
.
Non è possibile usare la parola chiave async
nel punto di ingresso dell'applicazione (in genere il metodo Main
).
Importante
A partire da C# 7.1, il metodo Main
può avere un modificatore async
. Per altre informazioni, vedere Principali valori asincroni restituiti. Per informazioni su come selezionare la versione del linguaggio C#, vedere l'articolo Selezionare la versione del linguaggio C#.
L'esempio seguente produce l'errore CS4009:
using System;
using System.Threading.Tasks;
public class Example
{
public static async void Main()
{
Console.WriteLine("About to wait two seconds");
await WaitTwoSeconds();
Console.WriteLine("About to exit the program");
}
private static async Task WaitTwoSeconds()
{
await Task.Delay(2000);
Console.WriteLine("Returning from an asynchronous method");
}
}
Aggiornare la versione del linguaggio C# usata dal progetto alla versione 7.1 o successiva.
Se si usa C# 7.0 o versione precedente, rimuovere la parola chiave async
dalla firma del punto di ingresso dell'applicazione. Rimuovere anche qualsiasi parola chiave await
usata per attendere i metodi asincroni nel punto di ingresso dell'applicazione.
Tuttavia, è comunque necessario attendere il completamento del metodo asincrono prima che il punto di ingresso riprenda l'esecuzione. In caso contrario, la compilazione genera l'avviso del compilatore CS4014 e l'applicazione terminerà prima del completamento dell'operazione asincrona. L'esempio seguente illustra questo problema:
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("About to wait two seconds");
WaitTwoSeconds();
Console.WriteLine("About to exit the program");
}
private static async Task WaitTwoSeconds()
{
await Task.Delay(2000);
Console.WriteLine("Returning from an asynchronous method");
}
}
// The example displays the following output:
// About to wait two seconds
// About to exit the program
Per attendere un metodo che restituisce un oggetto Task, chiamare il relativo metodo Wait, come illustrato nell'esempio seguente:
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("About to wait two seconds");
WaitTwoSeconds().Wait();
Console.WriteLine("About to exit the program");
}
private static async Task WaitTwoSeconds()
{
await Task.Delay(2000);
Console.WriteLine("Returning from an asynchronous method");
}
}
// The example displays the following output:
// About to wait two seconds
// Returning from an asynchronous method
// About to exit the program
Per attendere un metodo che restituisce un Task<TResult>, recuperare il valore della relativa proprietà Result, come nell'esempio seguente:
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("About to wait two seconds");
int value = WaitTwoSeconds().Result;
Console.WriteLine($"Value returned from the async operation: {value}");
Console.WriteLine("About to exit the program");
}
private static async Task<int> WaitTwoSeconds()
{
await Task.Delay(2000);
Console.WriteLine("Returning from an asynchronous method");
return 100;
}
}
// The example displays the following output:
// About to wait two seconds
// Returning from an asynchronous method
// Value returned from the async operation: 100
// About to exit the program
Feedback su .NET
.NET è un progetto di open source. Selezionare un collegamento per fornire feedback: