1. ホーム
  2. c#

[解決済み] .NET Coreで非同期コンソールアプリケーションはサポートされていますか?

2022-07-23 12:26:59

質問

ある時点で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!");
        }
    }
}

これらは両方ともエラーで失敗します。

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

.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で導入されました。しかし、この機能は最初から利用できるわけではありません。この機能を利用するには、C#のバージョン7.1を明示的に指定する必要があります。 .csproj ファイルに

<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. チャンピオン "非同期メイン" (C# 7.1)