.NET Core是否支持异步控制台应用程序?


113

在某个时间点,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”方法

.NET Core RTM是否支持异步控制台应用程序?



6
@svick实际上是异步的在c#7.1中已添加主要支持, docs.microsoft.com/zh - cn/dotnet/csharp/whats - new / ...-在Visual Studio 2017项目中,转到项目属性->构建->高级,然后改变你的语言版本7.1(或更高版本)
ALV

1
请记住要更改properties -> build -> advanced -> language version“调试和发布”构建类型,否则项目将在发布时失败。
Mark

2
在我的项目中,仅当我使用Task而不是void时,“异步Main”才有效。由于无效,我收到了错误“ CS5001”。
菲利佩·德维萨

Answers:


175

是的,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版中引入了对功能的支持。但是,此功能不是开箱即用的。要使用此功能,您需要在.csproj文件中明确指定C#版本7.1 ,方法是包括

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

可以将Main函数重写如下:

using System.Threading.Tasks;

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

参考文献:

  1. C#7系列,第2部分:异步主要
  2. 冠军“异步主”(C#7.1)

6
您还可以在项目属性中设置语言版本(现在?)。生成->高级->语言版本。
尼克,

默认情况下,此选项的值为“最新主要版本”,等于7.0,而不是7.1!手动更改。
尤金·霍扎

1
第一个参考链接无效;这是
回程

1
该链接已失效,因为Microsoft员工显然需要手动迁移其博客:social.technet.microsoft.com/Forums/en-US/…–
kristianp

50

更新:C#7.1原生支持异步main!请参阅上述Evgeny的答案

对于后代,我将保留以下变通方法,但不再需要。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


10

对异步入口点的支持已在不久前删除。

请参阅aspnet / announcements github上的此问题

我们决定朝着桌面CLR统一入口点语义的方向发展。

在RC1中已过时:

支持异步/任务<> Main。

支持实例化入口点类型(程序)。

Main方法应为public static void Main或public static int Main。

支持将依赖项注入Program类的构造函数和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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.