c# - webapi - ¿Las aplicaciones de consola asíncrona son compatibles con.NET Core?
install dotnet command line (3)
En algún momento, CoreCLR admitía puntos de entrada principales asíncronos. Ver http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html
Sin embargo, los siguientes programas 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 programa no contiene un método ''Principal'' estático adecuado para un punto de entrada
¿Las aplicaciones de consola asíncrona son compatibles con .NET Core RTM?
El soporte para puntos de entrada asíncronos se eliminó hace un tiempo.
Vea este problema en aspnet / ads github.
Decidimos avanzar hacia la unificación de la semántica de punto de entrada con CLR de escritorio.
Obsoleto en RC1:
Soporte para asíncrono / Tarea <> Principal.
Soporte para instanciación del tipo de punto de entrada (Programa).
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 programa y el método Main.
Utilice PlatformServices y CompilationServices en su lugar.
Para llegar a IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager use Microsoft.Extensions.PlatformAbstraction.PlatformServices.Default objeto estático.
Para llegar a ILibraryExporter, ICompilerOptionsProvider utilice el objeto estático Microsoft.Extensions.CompilationAbstraction.CompilationServices.Default.
Soporte para CallContextServiceLocator. Utilice PlatformServices y CompilationServices en su lugar.
Lo mismo que arriba.
Estos se eliminarían en RC2: # 106
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 presenta en C # versión 7.1.
Sin embargo, esta funcionalidad no está disponible de fábrica.
Para utilizar esta función, debe especificar explícitamente la versión 7.1 de C # en su archivo
.csproj
, ya sea incluyendo
<LangVersion>latest</LangVersion>
o por
<LangVersion>7.1</LangVersion>
Por ejemplo para el proyecto ASP.NET core 2.0:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
</ItemGroup>
</Project>
donde la función principal se puede reescribir de la siguiente manera:
using System.Threading.Tasks;
...
public static async Task Main(string[] args)
{
await BuildWebHost(args).RunAsync();
}
...
Referencias
Actualización : ¡Async main es compatible de forma nativa con C # 7.1! Ver la answer de Evgeny arriba.
Mantendré la siguiente solución para la posteridad, pero ya no es necesaria.
async main
es mucho más simple.
Como dijo Nick, se eliminó el apoyo para esto. 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
(bloqueo sincrónico), pero
se prefiere
porque desenvuelve las excepciones.
Existe una propuesta para agregar
async Main()
a una versión futura de C #:
csharplang # 97