¿Las aplicaciones de consola asíncronas son compatibles con .NET Core?

En algún momento, CoreCLR admitió puntos de entrada principales asíncronos. Ver http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Sin embargo, los dos progtwigs siguientes no funcionan en .NET Core RTM

using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public static async Task Main(string[] args) { await Task.Delay(1000); Console.WriteLine("Hello World!"); } } } 

o

 using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public async Task Main(string[] args) { await Task.Delay(1000); Console.WriteLine("Hello World!"); } } } 

Ambos fallan con el error:

error CS5001: el progtwig no contiene un método estático ‘Principal’ adecuado para un punto de entrada

¿Las aplicaciones de consola asíncronas son compatibles con .NET Core RTM?

Sí, las funciones async Main son compatibles desde .NET Core 2.0 .

 dotnet --info .NET Command Line Tools (2.0.0) Product Information: Version: 2.0.0 Commit SHA-1 hash: cdcd1928c9 Runtime Environment: OS Name: ubuntu OS Version: 16.04 OS Platform: Linux RID: ubuntu.16.04-x64 Base Path: /usr/share/dotnet/sdk/2.0.0/ Microsoft .NET Core Shared Framework Host Version : 2.0.0 Build : e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d 

El soporte para las funciones async Main se introduce en C # versión 7.1. Sin embargo, esta funcionalidad no está disponible fuera de la caja. Para utilizar esta función, debe especificar explícitamente la versión 7.1 de C # en su archivo .csproj , ya sea incluyendo

 latest 

o por

 7.1 

Por ejemplo, para el proyecto ASP.NET core 2.0:

   netcoreapp2.0 latest           

donde la función principal se puede reescribir como sigue:

 using System.Threading.Tasks; ... public static async Task Main(string[] args) { await BuildWebHost(args).RunAsync(); } ... 

Referencias:

  1. Serie C # 7, Parte 2: Principal Async
  2. Campeón “Async Main” (C # 7.1)

Actualización : ¡Async main es compatible de forma nativa con C # 7.1! Ver la respuesta de Evgeny arriba.

Mantendré la siguiente solución para la posteridad, pero ya no es necesaria. async main es mucho más sencillo.


Como dijo Nick, el apoyo para esto fue eliminado. Esta es mi solución preferida:

 using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); Console.ReadKey(); } public static async Task MainAsync(string[] args) { await Task.Delay(1000); Console.WriteLine("Hello World!"); } } } 

GetAwaiter().GetResult() es lo mismo que .Wait (locking síncrono), pero es preferible porque desenvuelve las excepciones.

Hay una propuesta para agregar async Main() a una versión futura de C #: csharplang # 97

El soporte para los puntos de entrada asíncronos se eliminó hace un tiempo.

Ver este problema en el github aspnet / anuncios.

Decidimos avanzar hacia la unificación de la semántica de punto de entrada con CLR de escritorio.

Obsoleto en RC1:

Soporte para async / Task <> Main.

Soporte para la creación de instancias de tipo de punto de entrada (Progtwig).

El método Main debe ser public static void Main o public static int Main.

Soporte para inyectar dependencias en el constructor de la clase del progtwig y el método principal.

Utilice PlatformServices y ComstacktionServices en su lugar.

Para obtener IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager use Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default static object.

Para acceder a ILibraryExporter, ICompilerOptionsProvider utiliza el objeto estático Microsoft.Extensions.ComstacktionAbstractions.ComstacktionServices.Default.

Soporte para CallContextServiceLocator. Utilice PlatformServices y ComstacktionServices en su lugar.

Lo mismo que arriba.

Estos serían eliminados en RC2: # 106