非同期コンソールアプリケーションは.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:プログラムには、エントリポイントに適した静的な「Main」メソッドが含まれていません

非同期コンソールアプリケーションは.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デバッグとリリースのビルドタイプを変更することを忘れないでください。変更しないと、プロジェクトが発行時に失敗します。
マーク

2
私のプロジェクトでは、「async Main」はvoidではなくTaskを使用した場合にのみ機能します。voidを使用すると、エラー「CS5001」を受け取りました。
Felipe Deveza 2017

回答:


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コア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)

6
プロジェクトのプロパティで言語バージョン(今?)を設定することもできます。ビルド->詳細設定->言語バージョン。
Nick

デフォルトでは、このオプションの値は「最新のメジャーバージョン」で、7.1ではなく7.0です。手動で変更してください。
Eugene

1
最初の参照リンクは無効です。これがウェイバックマシンキャッシュです。web.archive.org
web

1
Microsoftの従業員は明らかに手動で自分のブログを移行する必要があるため、リンクが死んでいる:social.technet.microsoft.com/Forums/en-US/...
kristianp

50

更新:非同期メインはC#7.1でネイティブにサポートされています!上記のエフゲニーの答えを見てください。

以下の回避策は後世に残しておきますが、不要になりました。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、IAsemblyLoaderContainer、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.