C# .NET核心是否支持异步控制台应用程序?
在某个时间点,CoreCLR支持异步主入口点。看 但是,以下两个程序都不能在.NET Core RTM中工作C# .NET核心是否支持异步控制台应用程序?,c#,.net,.net-core,C#,.net,.net Core,在某个时间点,CoreCLR支持异步主入口点。看 但是,以下两个程序都不能在.NET Core RTM中工作 using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public static async Task Main(string[] args) { await Task.De
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!");
}
}
}
或
这两种方法都会失败,并出现错误:
错误CS5001:程序不包含适合入口点的静态“Main”方法
.NET Core RTM是否支持异步控制台应用程序?对异步入口点的支持不久前被删除 请参阅aspnet/github上的 我们决定将入口点语义与 桌面CLR 在RC1中已过时: 支持异步/主任务 支持实例化入口点类型(程序) Main方法应该是publicstaticvoidmain或publicstaticintmain 支持将依赖项注入程序类的构造函数和主方法 改用PlatformServices和CompliationServices 要访问IApplicationEnvironment、IRuntimeEnvironment、IAssemblyLoaderContainer、IAssemblyLoadContextAccessor, 图书馆经理 使用Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default 静态对象 要访问ILibraryExporter,ICompilerOptionsProvider使用Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default 静态对象 支持CallContextServiceLocator。改用PlatformServices和CompliationServices 同上 这些将在RC2中删除:#106
更新:C#7.1本机支持Async main!见上面的叶甫根尼 我将为后代保留下面的变通方法,但它不再需要了
async main
更简单,如果可以,请使用它
这是我在C#7.1以下版本中首选的解决方法:
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
(同步阻塞)相同,但因为它会打开异常。是的,自.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#version 7.1中引入。但是,此功能不是现成的。要使用此功能,您需要在.csproj
文件中明确指定C#version 7.1,包括
<LangVersion>latest</LangVersion>
参考资料:
请注意,@svick actually async Main support已添加到c#7.1中,-在visual studio 2017项目中,转到项目属性->构建->高级,然后将语言版本更改为7.1(或更高版本)。记住更改调试和发布构建类型的
属性->构建->高级->语言版本
,else项目将在发布时失败。在我的项目中,“async Main”仅在我使用Task而不是void时有效。使用void时,我收到了错误“CS5001”。您还可以在项目属性中设置语言版本(现在?);Build->Advanced->Language version。默认情况下,此选项的值为“最新主要版本”,等于7.0,而不是7.1!手动更改。第一个参考链接已失效;这是回程机器缓存:链接已失效,因为Microsoft员工需要手动迁移他们的博客:
<LangVersion>latest</LangVersion>
<LangVersion>7.1</LangVersion>
<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();
}
...