Поддерживаются ли асинхронные консольные приложения in.NET ядро?


в какой-то момент времени 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, подходящего для записи точка

асинхронный консольных приложений поддерживается .Чистая ядра РТМ?

3 64

3 ответа:

да 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>

где Основная функция может быть переписана следующим образом:

using System.Threading.Tasks;

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

ссылки:

  1. Серия C# 7, Часть 2: Async Main
  2. Чемпион " Async Main "(C# 7.1)

обновление: async main поддерживается изначально C# 7.1! Смотрите Евгения ответ выше.

Я буду держать ниже обходной путь для потомков, но это больше не нужно. async main есть способ проще.


как сказал Ник, поддержка для этого была удалена. Это мой предпочтительный обходной путь:

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 / анонсы github.

мы решили перейти к унификации семантики точки входа с помощью desktop CLR.

устарел в RC1:

поддержка async / Task Main.

поддержка создания экземпляра типа точки входа (программа).

основной метод должен быть public static void Главная или и Инт.

поддержка введения зависимостей в конструктор класса программы и метод Main.

вместо этого используйте PlatformServices и CompilationServices.

чтобы добраться до IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager использовать Microsoft.Увеличение.PlatformAbstractions.PlatformServices.По умолчанию статический объект.

чтобы добраться до ILibraryExporter, ICompilerOptionsProvider использовать Microsoft.Увеличение.CompilationAbstractions.CompilationServices.По умолчанию статический объект.

поддержка CallContextServiceLocator. Вместо этого используйте PlatformServices и CompilationServices.

то же, что и выше.

Они будут удалены в RC2: #106