C# .NET核心是否支持异步控制台应用程序?

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

在某个时间点,CoreCLR支持异步主入口点。看

但是,以下两个程序都不能在.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!");
        }
    }
}

这两种方法都会失败,并出现错误:

错误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();
    }
    ...