Các ứng dụng bảng điều khiển không đồng bộ có được hỗ trợ trong .NET Core không?


113

Tại một số thời điểm CoreCLR hỗ trợ các điểm vào chính không đồng bộ. Xem http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html

Tuy nhiên, cả hai chương trình sau đều không hoạt động trong .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!");
        }
    }
}

hoặc là

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

Cả hai đều không thành công với lỗi:

lỗi CS5001: Chương trình không chứa phương thức tĩnh 'Chính' phù hợp với điểm nhập

Các ứng dụng bảng điều khiển không đồng bộ có được hỗ trợ trong .NET Core RTM không?



6
@svick thực sự không đồng bộ Hỗ trợ chính đã được thêm vào c # 7.1, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… - Trong dự án studio trực quan 2017 của bạn, đi tới thuộc tính dự án -> xây dựng -> nâng cao , sau đó thay đổi phiên bản ngôn ngữ của bạn thành 7.1 (hoặc cao hơn)
alv

1
Hãy nhớ thay đổi properties -> build -> advanced -> language versioncác loại bản dựng Gỡ lỗi VÀ Phát hành, nếu không dự án sẽ không thành công khi Xuất bản.
Đánh dấu

2
Trong dự án của tôi, 'async Main' chỉ hoạt động nếu tôi đã sử dụng Task thay vì void. Với void, tôi nhận được lỗi 'CS5001'.
Felipe Deveza

Câu trả lời:


175

Có, các async Mainchức năng được hỗ trợ kể từ .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

Hỗ trợ cho các async Mainchức năng được giới thiệu trong C # phiên bản 7.1. Tuy nhiên, chức năng này không có sẵn ngoài hộp. Để sử dụng tính năng này, bạn cần chỉ định rõ ràng C # phiên bản 7.1 trong .csprojtệp của mình , bằng cách bao gồm

<LangVersion>latest</LangVersion>

hoặc bằng cách

<LangVersion>7.1</LangVersion>

Ví dụ cho dự án 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>

trong đó Chức năng chính có thể được viết lại như sau:

using System.Threading.Tasks;

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

Người giới thiệu:

  1. C # 7 Series, Phần 2: Async Main
  2. Vô địch "Async Main" (C # 7.1)

6
Bạn cũng có thể đặt phiên bản ngôn ngữ (bây giờ?) Trong các thuộc tính của dự án; Phiên bản xây dựng -> Nâng cao -> Ngôn ngữ.
Nick

Theo mặc định, tùy chọn này có giá trị là "phiên bản chính mới nhất" và bằng 7.0, không phải 7.1! Thay đổi nó theo cách thủ công.
Eugene Hoza

1
Liên kết tham chiếu đầu tiên đã chết; đây là bộ nhớ cache của máy dự phòng: web.archive.org/web/20190118084407/https://…
kristianp

1
Liên kết đã chết vì nhân viên Microsoft cần di chuyển blog của họ theo cách thủ công: social.technet.microsoft.com/Forums/en-US/…
kristianp

50

Cập nhật : Async main được hỗ trợ bởi C # 7.1! Xem câu trả lời của Evgeny ở trên.

Tôi sẽ giữ lại giải pháp dưới đây cho hậu thế, nhưng nó không còn cần thiết nữa. async mainlà cách đơn giản hơn.


Như Nick đã nói, hỗ trợ cho điều này đã bị loại bỏ. Đây là cách giải quyết ưa thích của tôi:

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()cũng giống như .Wait(chặn đồng bộ), nhưng được ưu tiên hơn vì nó loại bỏ các ngoại lệ.

Có một đề xuất để thêm async Main()vào phiên bản tương lai của C #: csharplang # 97


10

Hỗ trợ cho các điểm nhập không đồng bộ đã bị loại bỏ một thời gian trước.

Xem vấn đề này trên aspnet / github thông báo.

Chúng tôi quyết định tiến tới hợp nhất ngữ nghĩa điểm đầu vào với CLR máy tính để bàn.

Đã lỗi thời trong RC1:

Hỗ trợ async / Task <> Main.

Hỗ trợ khởi tạo loại điểm vào (Chương trình).

Phương thức Main phải là public static void Main hoặc public static int Main.

Hỗ trợ đưa các phụ thuộc vào phương thức khởi tạo và phương thức Main của lớp Chương trình.

Thay vào đó, hãy sử dụng PlatformServices và CompilationServices.

Để truy cập IApplicationEnosystem, IRuntimeEnosystem, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager, hãy sử dụng đối tượng tĩnh Microsoft.Extensions.PlatformAbstaries.PlatformServices.Default.

Để truy cập ILibraryExporter, ICompilerOptionsProvider sử dụng đối tượng tĩnh Microsoft.Extensions.CompilationAbstaries.CompilationServices.Default.

Hỗ trợ cho CallContextServiceLocator. Thay vào đó, hãy sử dụng PlatformServices và CompilationServices.

Giống như trên.

Những thứ này sẽ bị xóa trong RC2: # 106

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.