Apakah aplikasi konsol async didukung di .NET Core?

113

Di beberapa titik waktu CoreCLR mendukung titik masuk utama asinkron. Lihat http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Namun kedua program berikut tidak bekerja di .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!");
        }
    }
}

atau

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!");
        }
    }
}

Keduanya gagal dengan kesalahan:

kesalahan CS5001: Program tidak berisi metode 'Utama' statis yang cocok untuk titik masuk

Apakah aplikasi konsol async didukung di .NET Core RTM?

kimsagro.dll
sumber
6
@svick sebenarnya asinkron Dukungan utama telah ditambahkan di c # 7.1, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… - Dalam proyek visual studio 2017 Anda, buka properti proyek -> build -> lanjutan , lalu ubah versi bahasa Anda menjadi 7.1 (atau lebih tinggi)
alv
1
Ingatlah untuk mengubah properties -> build -> advanced -> language versionjenis build Debug DAN Rilis, jika tidak, proyek akan gagal di Publikasikan.
Tandai
2
Dalam proyek saya, 'async Main' hanya berfungsi jika saya menggunakan Task, bukan void. Dengan void saya menerima error 'CS5001'.
Felipe Deveza

Jawaban:

175

Ya, sejak itu async Mainfungsinya didukung .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

Dukungan untuk async Mainfungsi diperkenalkan di C # versi 7.1. Namun, fungsi ini tidak tersedia di luar kotak. Untuk menggunakan fitur ini Anda perlu secara eksplisit menentukan C # versi 7.1 dalam .csprojfile Anda , baik dengan menyertakan

<LangVersion>latest</LangVersion>

atau oleh

<LangVersion>7.1</LangVersion>

Misalnya untuk proyek inti 2.0 ASP.NET:

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

di mana fungsi Utama dapat ditulis ulang sebagai berikut:

using System.Threading.Tasks;

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

Referensi:

  1. Seri C # 7, Bagian 2: Asinkron Utama
  2. Juara "Async Main" (C # 7.1)
Evgeny Bobkin
sumber
6
Anda juga dapat menyetel versi bahasa (sekarang?) Di properti proyek; Build -> Advanced -> Versi bahasa.
Nick
Secara default, opsi ini memiliki nilai "versi mayor terbaru" dan sama dengan 7.0, bukan 7.1! Ubah secara manual.
Eugene Hoza
1
Tautan referensi pertama sudah mati; inilah cache mesin wayback
kristianp
1
Tautan sudah mati karena karyawan Microsoft perlu memigrasi blog mereka secara manual: social.technet.microsoft.com/Forums/en-US/…
kristianp
50

Pembaruan : Async utama didukung secara asli oleh C # 7.1! Lihat jawaban Evgeny di atas.

Saya akan menyimpan solusi di bawah ini untuk anak cucu, tetapi itu tidak lagi diperlukan. async mainjauh lebih sederhana.


Seperti yang dikatakan Nick, dukungan untuk ini telah dihapus. Ini adalah solusi pilihan saya:

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()sama dengan .Wait(memblokir secara sinkron), tetapi lebih disukai karena membuka pengecualian.

Ada usulan untuk ditambahkan async Main()ke versi C #: csharplang # 97 mendatang

Nate Barbettini
sumber
10

Dukungan untuk titik masuk asinkron telah dihapus beberapa waktu lalu.

Lihat masalah ini di aspnet / pengumuman github.

Kami memutuskan untuk beralih ke penyatuan semantik titik masuk dengan CLR desktop.

Kedaluwarsa di RC1:

Dukungan untuk async / Task <> Main.

Dukungan untuk membuat contoh jenis titik masuk (Program).

Metode Utama harus public static void Main atau public static int Main.

Dukungan untuk memasukkan dependensi ke konstruktor kelas Program dan metode Utama.

Gunakan PlatformServices dan CompilationServices sebagai gantinya.

Untuk masuk ke IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager gunakan Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default objek statis.

Untuk masuk ke ILibraryExporter, ICompilerOptionsProvider menggunakan objek statis Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default.

Dukungan untuk CallContextServiceLocator. Gunakan PlatformServices dan CompilationServices sebagai gantinya.

Sama seperti di atas.

Ini akan dihapus di RC2: # 106

Nick Acosta
sumber