어떤 시점에서 CoreCLR은 비동기 기본 진입 점을 지원했습니다. http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html 참조
그러나 다음 프로그램은 .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!");
}
}
}
또는
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!");
}
}
}
둘 다 오류와 함께 실패합니다.
오류 CS5001 : 프로그램에 진입 점에 적합한 정적 ‘기본’메서드가 없습니다.
.NET Core RTM에서 비동기 콘솔 애플리케이션이 지원 되나요?
답변
예, async Main
기능은 .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
async Main
함수에 대한 지원 은 C # 버전 7.1에 도입되었습니다. 그러나이 기능은 기본적으로 사용할 수 없습니다. 이 기능을 사용하려면 다음 .csproj
을 포함 하여 파일 에 C # 버전 7.1을 명시 적으로 지정해야합니다.
<LangVersion>latest</LangVersion>
또는
<LangVersion>7.1</LangVersion>
예를 들어 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>
Main 함수는 다음과 같이 다시 작성할 수 있습니다.
using System.Threading.Tasks;
...
public static async Task Main(string[] args)
{
await BuildWebHost(args).RunAsync();
}
...
참조 :
답변
업데이트 : Async main은 C # 7.1에서 기본적으로 지원됩니다! 위 의 Evgeny의 답변을 참조하십시오 .
후손을 위해 아래 해결 방법을 유지할 것이지만 더 이상 필요하지 않습니다. async main
훨씬 간단합니다.
Nick이 말했듯이 이에 대한 지원이 제거되었습니다. 이것이 내가 선호하는 해결 방법입니다.
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()
.Wait
(동 기적 으로 차단) 과 동일 하지만 예외를 풀기 때문에 선호 됩니다.
다음 async Main()
버전의 C # 에 추가 하기 위한 제안이 있습니다 . csharplang # 97
답변
비동기 진입 점에 대한 지원이 잠시 제거되었습니다.
aspnet / announcements github 에서이 문제 를 참조하십시오 .
우리는 데스크톱 CLR과 진입 점 의미 체계를 통합하기로 결정했습니다.
RC1에서 사용되지 않음 :
async / Task <> Main 지원.
진입 점 유형 (프로그램)의 인스턴스화 지원.
Main 메서드는 public static void Main 또는 public static int Main이어야합니다.
Program 클래스의 생성자 및 Main 메서드에 종속성 주입 지원.
대신 PlatformServices 및 CompilationServices를 사용하십시오.
IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager를 가져 오려면 Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default 정적 개체를 사용합니다.
ILibraryExporter로 이동하려면 ICompilerOptionsProvider는 Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default 정적 개체를 사용합니다.
CallContextServiceLocator 지원. 대신 PlatformServices 및 CompilationServices를 사용하십시오.
같은 상기와.
RC2에서 제거됩니다. # 106