2016-06-30 6 views
36

W pewnym momencie CoreCLR obsłużył główne punkty wejścia async. Zobacz http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.htmlCzy aplikacje konsoli asynchronicznej są obsługiwane w .NET Core?

Jednak oba następujące programy nie działają w .NET rdzenia 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!"); 
     } 
    } 
} 

lub

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

Są zarówno niepowodzeniem z błędem:

error CS5001: Program does not contain a static 'Main' method suitable for an entry point

Are asynchroniczny aplikacje konsolowe obsługiwane w .NET Core RTM?

+4

Należy zauważyć, że [ 'asynchroniczny Main' nośnik obecnie planowane dla C# 7.0] (https://github.com/dotnet/roslyn/ blob/master/docs/Język% 20Feature% 20Status.md). – svick

+3

@svick faktycznie async Główne wsparcie zostało dodane w C# 7.1, https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-1 # async-main - W projekcie visual studio 2017 przejdź do właściwości projektu -> kompilacja -> zaawansowane, a następnie zmień wersję językową na 7.1 (lub nowszy) – alv

+1

Pamiętaj, aby zmienić właściwości '' '-> kompilacja -> zaawansowane -> wersja językowa''' dla typów kompilacji debugowania i wydania, w przeciwnym razie projekt zakończy się niepowodzeniem podczas publikowania. – Mark

Odpowiedz

44

Tak, funkcje są obsługiwane async Main od .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 

Wsparcie dla funkcji async Main jest wprowadzony w języku C# w wersji 7.1. Jednak ta funkcja nie jest dostępna po wyjęciu z pudełka. Aby skorzystać z tej funkcji trzeba wyraźnie określić C# w wersji 7.1 w pliku .csproj, albo przez włączenie

<LangVersion>latest</LangVersion> 

lub przez

<LangVersion>7.1</LangVersion> 

na przykład do podstawowego projektu ASP.NET 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> 

gdzie funkcja główna może być zapisane w następujący sposób:

using System.Threading.Tasks; 

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

Odniesienia:

  1. C# 7 Series, Part 2: Async Main
  2. Champion "Async Main" (C# 7.1)
+3

Dodanie "najnowszej wersji pliku"/"do pliku csproj było dokładnie tym, czego potrzebowałem. Wstawiłem go do mojej sekcji ''. –

9

Obsługa punktów asynchronicznych została usunięta chwilę po powrocie.

Zobacz this issue na github aspnet/announcement.

We decided to move towards unification of entry point semantics with desktop CLR.

Obsolete in RC1:

Support for async/Task<> Main.

Support for instantiating of entry point type (Program).

The Main method should be public static void Main or public static int Main.

Support for injecting dependencies into the Program class's constructor and Main method.

Use PlatformServices and CompilationServices instead.

To get to IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager use Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default static object.

To get to ILibraryExporter, ICompilerOptionsProvider use the Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default static object.

Support for CallContextServiceLocator. Use PlatformServices and CompilationServices instead.

Same as above.

These would be removed in RC2: #106

31

Jak powiedział Nick, wsparcie dla tego zostało usunięte. Jest to mój ulubiony obejście:

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() jest taka sama jak .Wait (blokowanie synchronicznie), ale is preferred ponieważ rozpakowuje wyjątki.

Jest to propozycja dla dodawania async Main() do przyszłej wersji C#: csharplang#97

+0

Dzięki za obejście problemu Nate! – Alex