Поддерживаются ли асинхронные консольные приложения 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 ответа:
да
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(); } ...
ссылки:
обновление: 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