Zaman uyumsuz konsol uygulamaları .NET Core'da destekleniyor mu?


113

Bazı zamanlarda CoreCLR, eşzamansız ana giriş noktalarını destekledi. Bkz. Http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Ancak aşağıdaki programların ikisi de .NET Core RTM'de çalışmıyor

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

veya

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

Bunların ikisi de şu hatayla başarısız olur:

CS5001 hatası: Program, bir giriş noktası için uygun olan statik bir 'Ana' yöntemi içermiyor

Zaman uyumsuz konsol uygulamaları .NET Core RTM'de destekleniyor mu?



6
@svick async Ana destek c # 7.1'e eklendi, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… - Görsel stüdyo 2017 projenizde, proje özelliklerine gidin -> derleme -> gelişmiş ardından 7.1 (veya üstü) için dil sürümünü değiştirmek
alv

1
properties -> build -> advanced -> language versionHata Ayıklama VE Yayın derleme türlerini değiştirmeyi unutmayın , aksi takdirde proje Yayımlamada başarısız olur.
Mark

2
Projemde, 'async Main' yalnızca void yerine Task kullandıysam çalışır. Void ile 'CS5001' hatasını aldım.
Felipe Deveza

Yanıtlar:


176

Evet, async Mainişlevler şu tarihten beri desteklenmektedir .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İşlevler için destek , C # sürüm 7.1'de sunulmuştur. Ancak, bu işlevsellik kutudan çıktığı anda mevcut değildir. Bu özelliği kullanmak için .csprojdosyanızda C # sürüm 7.1'i açık bir şekilde belirtmeniz gerekir.

<LangVersion>latest</LangVersion>

veya tarafından

<LangVersion>7.1</LangVersion>

Örneğin, ASP.NET çekirdek 2.0 projesi için:

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

Ana işlev aşağıdaki gibi yeniden yazılabilir:

using System.Threading.Tasks;

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

Referanslar:

  1. C # 7 Serisi, Bölüm 2: Asenkron Ana
  2. Şampiyon "Async Main" (C # 7.1)

6
Ayrıca proje özelliklerinde dil sürümünü (şimdi?) Ayarlayabilirsiniz; Oluştur -> Gelişmiş -> Dil sürümü.
Nick

Varsayılan olarak bu seçenek "en son ana sürüm" değerine sahiptir ve 7.1'e değil 7.0'a eşittir! Manuel olarak değiştirin.
Eugene Hoza

1
İlk referans bağlantısı öldü; işte geri dönüş
kristianp

1
Bağlantı kesildi
kristianp

50

Güncelleme : Zaman uyumsuz ana yerel olarak C # 7.1 tarafından desteklenir! Evgeny'nin yukarıdaki cevabına bakın .

Gelecek nesil için aşağıdaki geçici çözümü devam ettireceğim, ancak artık buna gerek yok. async mainçok daha basit.


Nick'in dediği gibi, buna verilen destek kaldırıldı. Bu benim tercih ettiğim geçici çözüm:

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(eşzamanlı olarak engelleme) ile aynıdır , ancak istisnaları çözdüğü için tercih edilir .

async Main()Gelecekteki bir C # sürümüne eklemek için bir öneri var : csharplang # 97


10

Zaman uyumsuz giriş noktaları desteği bir süre önce kaldırıldı.

Bkz bu sorunu aspnet üzerinde / duyurular GitHub'dan.

Giriş noktası anlambilimini masaüstü CLR ile birleştirmeye karar verdik.

RC1'de Eski:

Zaman uyumsuz / Görev <> Ana Desteği.

Giriş noktası türünün örneklenmesi için destek (Program).

Main yöntemi public static void Main veya public static int Main olmalıdır.

Bağımlılıkları Program sınıfının yapıcısına ve Main yöntemine eklemeye yönelik destek.

Bunun yerine PlatformServices ve CompilationServices kullanın.

IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager'a ulaşmak için Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default statik nesnesini kullanın.

ILibraryExporter'a ulaşmak için, ICompilerOptionsProvider Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default statik nesnesini kullanın.

CallContextServiceLocator desteği. Bunun yerine PlatformServices ve CompilationServices kullanın.

Yukarıdaki ile aynı.

Bunlar RC2'de kaldırılacaktır: # 106

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.