130 votes

Les applications consoles asynchrones sont-elles prises en charge dans .NET Core ?

À un moment donné, le CoreCLR a pris en charge les points d'entrée principaux asynchrones. Voir http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Cependant, les deux programmes suivants ne fonctionnent pas dans .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!");
        }
    }
}

Les deux échouent avec l'erreur :

erreur CS5001 : le programme ne contient pas de méthode statique 'Main' convenant à un point d'entrée

Les applications asynchrones en console sont-elles prises en charge dans .NET Core RTM ?

5 votes

6 votes

@svick en fait, le support async Main a été ajouté dans c# 7.1, docs.microsoft.com/fr/us/dotnet/csharp/whats-new/ - Dans votre projet visual studio 2017, allez dans les propriétés du projet -> build -> advanced, puis changez votre version de langue à 7.1 (ou plus).

1 votes

N'oubliez pas de changer properties -> build -> advanced -> language version pour les types de construction Debug ET Release, sinon le projet échouera lors de la publication.

189voto

Evgeny Bobkin Points 1756

Oui, le async Main sont prises en charge depuis .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

Le soutien à la async Main est introduite dans la version 7.1 de C#. Toutefois, cette fonctionnalité n'est pas disponible d'emblée. Pour utiliser cette fonctionnalité, vous devez spécifier explicitement la version 7.1 de C# dans votre fichier .csproj soit en incluant

<LangVersion>latest</LangVersion>

ou par

<LangVersion>7.1</LangVersion>

Par exemple pour le projet 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>

où la fonction principale peut être réécrite comme suit :

using System.Threading.Tasks;

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

Références :

  1. Série C# 7, partie 2 : Async Main
  2. Champion "Async Main" (C# 7.1)

6 votes

Vous pouvez également définir la version de la langue (maintenant ?) dans les propriétés du projet ; Build -> Advanced -> Language version.

0 votes

Par défaut, cette option a la valeur "dernière version majeure" et est égale à 7.0, et non 7.1 ! Changez-la manuellement.

1 votes

Le premier lien de référence est mort ; voici le cache de la machine wayback : web.archive.org/web/20190118084407/https://…

58voto

Nate Barbettini Points 26922

Mise à jour : Async main est supporté nativement par C# 7.1 ! Voir l'article d'Evgeny réponse ci-dessus.

Je garde la solution de contournement ci-dessous pour la postérité, mais elle n'est plus nécessaire. async main est beaucoup plus simple, utilisez-le si vous le pouvez !


Voici la solution que je préfère en C# inférieur à 7.1 :

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() est la même chose que .Wait (blocage synchrone), mais est préféré car il déballe les exceptions.

11voto

Nick Acosta Points 1541

La prise en charge des points d'entrée asynchrones a été supprimée il y a quelque temps.

Voir cette question sur le github aspnet/announcements.

Nous avons décidé de nous orienter vers une unification de la sémantique des points d'entrée avec CLR de bureau.

Obsolète dans la RC1 :

Support pour async/Task<> Main.

Prise en charge de l'instanciation du type de point d'entrée (Programme).

La méthode Main doit être public static void Main ou public static int Main.

Prise en charge de l'injection de dépendances dans le constructeur et la méthode Main de la classe Program.

Utilisez plutôt PlatformServices et CompilationServices.

Pour accéder à IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager utiliser Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default objet statique.

Pour accéder à ILibraryExporter, ICompilerOptionsProvider, utilisez l'objet statique Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default objet statique.

Prise en charge de CallContextServiceLocator. Utilisez plutôt PlatformServices et CompilationServices.

Idem que ci-dessus.

Ils seront supprimés dans la RC2 : #106

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X