क्या async कंसोल अनुप्रयोग .NET कोर में समर्थित हैं?


113

कुछ समय में CoreCLR ने async मुख्य प्रवेश बिंदुओं का समर्थन किया। Http://blog.stephencleary.com/2015/03/async-console-apps-on-net-coreclr.html देखें

हालाँकि निम्न दोनों प्रोग्राम .NET कोर 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 कोर RTM में समर्थित हैं?



6
@svick वास्तव में async मुख्य समर्थन c # 7.1 में जोड़ा गया है, docs.microsoft.com/en-us/dotnet/csharp/whats-new/… - अपने विज़ुअल स्टूडियो 2017 प्रोजेक्ट में, प्रोजेक्ट गुणों पर जाएं - इस -> उन्नत , फिर अपना भाषा संस्करण 7.1 (या उच्चतर) में
बदलें

1
properties -> build -> advanced -> language versionडिबग और रिलीज़ बिल्ड प्रकारों के लिए परिवर्तन करना याद रखें , अन्यथा प्रोजेक्ट प्रकाशित पर विफल हो जाएगा।
मार्क

2
मेरे प्रोजेक्ट में, 'async Main' केवल तभी काम करता है जब मैं void के बजाय टास्क का उपयोग करता हूं। शून्य के साथ मुझे 'CS5001' त्रुटि मिली।
फेलिप डिवेज़

जवाबों:


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 कोर 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>

जहां मुख्य समारोह को निम्नलिखित के रूप में फिर से लिखा जा सकता है:

using System.Threading.Tasks;

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

संदर्भ:

  1. सी # 7 श्रृंखला, भाग 2: Async मुख्य
  2. चैंपियन "Async Main" (C # 7.1)

6
आप प्रोजेक्ट गुणों में भाषा संस्करण (अब?) भी सेट कर सकते हैं; बिल्ड -> उन्नत -> भाषा संस्करण।
निक

डिफ़ॉल्ट रूप से इस विकल्प का "नवीनतम प्रमुख संस्करण" मूल्य है और 7.0 के बराबर है, 7.1 नहीं! इसे मैन्युअल रूप से बदलें।
यूजीन होजा

1
पहला संदर्भ लिंक मृत है; यहाँ एक तरह से कैशबैक मशीन है: web.archive.org/web/20190118084407/https://…
kristianp

1
यह लिंक मृत है क्योंकि Microsoft कर्मचारियों को अपने ब्लॉग को मैन्युअल रूप से माइग्रेट करने की आवश्यकता है: social.technet.microsoft.com/Forums/en-US/…
kristianp

50

अद्यतन : Async मुख्य C # 7.1 द्वारा मूल रूप से समर्थित है! ऊपर एवगेनी का जवाब देखें ।

मैं नीचे दिए गए वर्कअराउंड को पोस्टीरिटी के लिए रखूंगा, लेकिन अब इसकी आवश्यकता नहीं है। 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

Async प्रविष्टि बिंदुओं के लिए समर्थन कुछ समय पहले हटा दिया गया था।

इस मुद्दे को एस्पनेट / घोषणाओं पर देखें ।

हमने डेस्कटॉप सीएलआर के साथ प्रवेश बिंदु शब्दार्थ के एकीकरण की ओर बढ़ने का फैसला किया।

RC1 में अप्रचलित:

Async / टास्क के लिए समर्थन <> मुख्य।

प्रवेश बिंदु प्रकार (कार्यक्रम) को तत्काल करने के लिए समर्थन।

मुख्य विधि सार्वजनिक स्थैतिक शून्य होना चाहिए मुख्य या सार्वजनिक स्थैतिक int मुख्य होना चाहिए।

कार्यक्रम वर्ग के निर्माता और मुख्य विधि में निर्भरता को इंजेक्ट करने के लिए समर्थन।

इसके बजाय PlatformServices और CompilationServices का उपयोग करें।

IApplicationEnvironment, IRuntimeEnvironment, IAssemblyLoaderContainer, IAssemblyLoadContextAccessor, ILibraryManager का उपयोग करने के लिए Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default static ऑब्जेक्ट का उपयोग करें।

ILibraryExporter करने के लिए, ICompilerOptionsProvider Microsoft.Extensions.CompilationAbstractions.CompilationServices.Default स्थिर ऑब्जेक्ट का उपयोग करें।

CallContextServiceLocator के लिए समर्थन। इसके बजाय PlatformServices और CompilationServices का उपयोग करें।

ऊपर की तरह।

इन्हें RC2: # 106 में निकाला जाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.