Поддерживаются ли консольные приложения async в .NET Core?
В некоторый момент времени CoreCLR поддерживает основные точки входа async. См. 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: программа не содержит статический метод "Главная", подходящий для точки входа
Поддерживаются ли консольные приложения async в RTM.NET Core?
Ответы
Ответ 1
Да, функции 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
вводится в версии С# 7.1. Однако эта функция недоступна из коробки. Чтобы использовать эту функцию, вам нужно явно указать версию С# версии 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();
}
...
Литература:
Ответ 2
Как сказал Ник, поддержка этого была удалена. Это мое предпочтительное решение:
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()
в будущую версию С#: csharplang # 97
Ответ 3
Поддержка асинхронных точек входа была удалена некоторое время назад.
См. эту проблему в gptub aspnet/announcements.
Мы решили перейти к унификации семантики точки входа с на рабочем столе CLR.
Устаревший в RC1:
Поддержка async/Task < > Main.
Поддержка создания экземпляра типа точки входа (Program).
Основной метод должен быть public static void Main или public static int Main.
Поддержка впрыскивания зависимостей в конструктор класса программы и метод 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