Werden asynchrone Konsolenanwendungen in .NET Core unterstützt?

113

Zu einem bestimmten Zeitpunkt unterstützte die CoreCLR asynchrone Haupteinstiegspunkte. Siehe http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Beide folgenden Programme funktionieren jedoch nicht in .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!");
        }
    }
}

oder

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!");
        }
    }
}

Diese beiden scheitern mit dem Fehler:

Fehler CS5001: Das Programm enthält keine statische 'Main'-Methode, die für einen Einstiegspunkt geeignet ist

Werden asynchrone Konsolenanwendungen in .NET Core RTM unterstützt?

kimsagro
quelle
6
@svick tatsächlich asynchron Die Hauptunterstützung wurde in c # 7.1, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… hinzugefügt. - Gehen Sie in Ihrem Visual Studio 2017-Projekt zu Projekteigenschaften -> Erstellen -> Erweitert , dann ändern Sie Ihre Sprachversion auf 7.1 (oder höher)
alv
1
Denken Sie daran, die properties -> build -> advanced -> language versionBuild-Typen Debug AND Release zu ändern , da sonst das Projekt beim Veröffentlichen fehlschlägt.
Mark
2
In meinem Projekt funktioniert 'async Main' nur, wenn ich Task anstelle von void verwendet habe. Mit void habe ich den Fehler 'CS5001' erhalten.
Felipe Deveza
Mögliches Duplikat von Kann den Modifikator 'asynchron' in der '
Liam

Antworten:

175

Ja, die async MainFunktionen werden seitdem unterstützt .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

Die Unterstützung für die async MainFunktionen wird in C # Version 7.1 eingeführt. Diese Funktionalität ist jedoch nicht sofort verfügbar. Um diese Funktion nutzen zu können, müssen Sie die C # -Version 7.1 explizit in Ihrer .csprojDatei angeben , indem Sie entweder einschließen

<LangVersion>latest</LangVersion>

oder von

<LangVersion>7.1</LangVersion>

Zum Beispiel für das ASP.NET Core 2.0-Projekt:

<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>

Dabei kann die Hauptfunktion wie folgt umgeschrieben werden:

using System.Threading.Tasks;

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

Verweise:

  1. C # 7-Serie, Teil 2: Async Main
  2. Champion "Async Main" (C # 7.1)
Evgeny Bobkin
quelle
6
Sie können die Sprachversion (jetzt?) Auch in den Projekteigenschaften festlegen. Build -> Advanced -> Sprachversion.
Nick
Standardmäßig hat diese Option den Wert "neueste Hauptversion" und entspricht 7.0, nicht 7.1! Ändern Sie es manuell.
Eugene Hoza
1
Der erste Referenzlink ist tot. Hier ist der Wayback-Maschinen-Cache: web.archive.org/web/20190118084407/https://…
kristianp
1
Der Link ist tot, weil Microsoft-Mitarbeiter ihre Blogs anscheinend manuell migrieren müssen: social.technet.microsoft.com/Forums/en-US/…
kristianp
50

Update : Async main wird nativ von C # 7.1 unterstützt! Siehe Evgenys Antwort oben.

Ich werde die folgende Problemumgehung für die Nachwelt beibehalten, sie wird jedoch nicht mehr benötigt. async mainist viel einfacher.


Wie Nick sagte, wurde die Unterstützung dafür entfernt. Dies ist meine bevorzugte Problemumgehung:

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()ist dasselbe wie .Wait(synchron blockieren), wird jedoch bevorzugt, da Ausnahmen ausgepackt werden.

Es gibt einen Vorschlag zum Hinzufügen async Main()zu einer zukünftigen Version von C #: csharplang # 97

Nate Barbettini
quelle
10

Die Unterstützung für asynchrone Einstiegspunkte wurde vor einiger Zeit entfernt.

Siehe dieses Problem auf dem Aspnet / Ankündigungen Github.

Wir haben uns entschlossen, die Einstiegspunktsemantik mit der Desktop-CLR zu vereinheitlichen.

In RC1 veraltet:

Unterstützung für Async / Task <> Main.

Unterstützung für die Instanziierung des Einstiegspunkttyps (Programm).

Die Main-Methode sollte public static void Main oder public static int Main sein.

Unterstützung für das Einfügen von Abhängigkeiten in den Konstruktor und die Main-Methode der Program-Klasse.

Verwenden Sie stattdessen PlatformServices und CompilationServices.

Verwenden Sie das statische Objekt Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default, um zu IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor und ILibraryManager zu gelangen.

Um zu ILibraryExporter zu gelangen, verwendet ICompilerOptionsProvider das statische Objekt Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default.

Unterstützung für CallContextServiceLocator. Verwenden Sie stattdessen PlatformServices und CompilationServices.

Das gleiche wie oben.

Diese würden in RC2: # 106 entfernt

Nick Acosta
quelle