.NET Core에서 비동기 콘솔 애플리케이션이 지원 되나요?


113

어떤 시점에서 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에서 비동기 콘솔 애플리케이션이 지원 되나요?



6
@svick 실제로 비동기 기본 지원이 c # 7.1, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… 에 추가되었습니다. -Visual Studio 2017 프로젝트에서 프로젝트 속성-> 빌드-> 고급으로 이동합니다. , 그런 다음 언어 버전을 7.1 (또는 그 이상)로 변경
alv

1
properties -> build -> advanced -> language version디버그 및 릴리스 빌드 유형 을 변경해야합니다 . 그렇지 않으면 게시시 프로젝트가 실패합니다.
Mark

2
내 프로젝트에서 'async Main'은 void 대신 Task를 사용한 경우에만 작동합니다. void로 'CS5001'오류를 받았습니다.
펠리페 데 베자

답변:


175

예, 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();
}
...

참조 :

  1. C # 7 시리즈, 2 부 : 비동기 기본
  2. 챔피언 "Async Main"(C # 7.1)

6
프로젝트 속성에서 언어 버전 (지금?)을 설정할 수도 있습니다. 빌드-> 고급-> 언어 버전.
Nick

기본적으로이 옵션의 값은 "최신 주 버전"이며 7.1이 아니라 7.0입니다! 수동으로 변경하십시오.
Eugene Hoza 2019

1
첫 번째 참조 링크가 작동하지 않습니다. 여기에 뒤로 기계 캐시는 다음과 같습니다 web.archive.org/web/20190118084407/https://...
kristianp은

1
Microsoft 직원이 블로그를 수동으로 마이그레이션해야하기 때문에 링크가 끊어
kristianp

50

업데이트 : 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


10

비동기 진입 점에 대한 지원이 잠시 제거되었습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.