you webapi tutorial the run new net must installed info have dotnet cli c# .net .net-core

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

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

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