แอปพลิเคชันคอนโซล async รองรับใน. NET Core หรือไม่


113

ในบางช่วงเวลา 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 รองรับใน. NET Core RTM หรือไม่



6
@svick มีการเพิ่มการสนับสนุนหลักของ async ใน c # 7.1, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… - ในโครงการ visual studio 2017 ของคุณไปที่คุณสมบัติโครงการ -> สร้าง -> ขั้นสูง จากนั้นเปลี่ยนเวอร์ชันภาษาของคุณเป็น 7.1 (หรือสูงกว่า)
60

1
อย่าลืมเปลี่ยนประเภทproperties -> build -> advanced -> language versionบิวด์ Debug AND Release มิฉะนั้นโปรเจ็กต์จะล้มเหลวในการเผยแพร่
มาร์ค

2
ในโปรเจ็กต์ของฉัน 'async Main' จะทำงานก็ต่อเมื่อฉันใช้งานแทนโมฆะ ด้วยโมฆะฉันได้รับข้อผิดพลาด 'CS5001'
Felipe Deveza

คำตอบ:


176

Yes, ฟังก์ชั่นได้รับการสนับสนุนตั้งแต่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>

โดยที่ฟังก์ชัน Main สามารถเขียนใหม่ได้ดังต่อไปนี้:

using System.Threading.Tasks;

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

อ้างอิง:

  1. ซีรีส์ C # 7 ตอนที่ 2: Async Main
  2. แชมป์ "Async Main" (C # 7.1)

6
คุณยังสามารถตั้งค่าเวอร์ชันภาษา (ตอนนี้?) ในคุณสมบัติโครงการ สร้าง -> ขั้นสูง -> เวอร์ชันภาษา
นิค

โดยค่าเริ่มต้นตัวเลือกนี้มีค่า "เวอร์ชันหลักล่าสุด" และเท่ากับ 7.0 ไม่ใช่ 7.1! เปลี่ยนด้วยตนเอง
Eugene Hoza

1
ลิงค์อ้างอิงแรกตาย นี่คือแคชของเครื่องสำรอง
kristianp

1
ลิงก์หยุดทำงานเนื่องจากพนักงานของ Microsoft จำเป็นต้องย้ายบล็อกด้วยตนเองอย่างเห็นได้ชัด: social.technet.microsoft.com/Forums/en-US/…
kristianp

50

อัปเดต : Async main ได้รับการสนับสนุนโดย C # 7.1! ดูคำตอบของ Evgeny ด้านบน

ฉันจะใช้วิธีแก้ปัญหาด้านล่างสำหรับลูกหลาน แต่ก็ไม่จำเป็นอีกต่อไป async mainเป็นวิธีที่ง่ายกว่า


ดังที่ Nick กล่าวว่าการสนับสนุนสำหรับสิ่งนี้ถูกลบออก นี่เป็นวิธีแก้ปัญหาที่ฉันต้องการ:

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

การสนับสนุนสำหรับจุดเข้า async ถูกลบออกไปในขณะที่ย้อนกลับ

ดูปัญหานี้ใน github ของ aspnet / ประกาศ

เราตัดสินใจที่จะก้าวไปสู่การรวมความหมายของจุดเริ่มต้นเข้ากับ CLR บนเดสก์ท็อป

ล้าสมัยใน RC1:

รองรับ async / Task <> Main

รองรับการสร้างอินสแตนซ์ของประเภทจุดเข้าใช้งาน (โปรแกรม)

วิธีหลักควรเป็นโมฆะแบบคงที่สาธารณะ Main หรือ public static int 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.