51

我从这个链接复制了下面的代码。 但是当我编译这个代码时,我得到一个入口点不能用'async'修饰符标记。如何使此代码可编译?

class Program
{
    static async void Main(string[] args)
    {
        Task<string> getWebPageTask = GetWebPageAsync("http://msdn.microsoft.com");

        Debug.WriteLine("In startButton_Click before await");
        string webText = await getWebPageTask;
        Debug.WriteLine("Characters received: " + webText.Length.ToString()); 
    }

    private static async Task<string> GetWebPageAsync(string url)
    {
        // Start an async task. 
        Task<string> getStringTask = (new HttpClient()).GetStringAsync(url);

        // Await the task. This is what happens: 
        // 1. Execution immediately returns to the calling method, returning a 
        //    different task from the task created in the previous statement. 
        //    Execution in this method is suspended. 
        // 2. When the task created in the previous statement completes, the 
        //    result from the GetStringAsync method is produced by the Await 
        //    statement, and execution continues within this method. 
        Debug.WriteLine("In GetWebPageAsync before await");
        string webText = await getStringTask;
        Debug.WriteLine("In GetWebPageAsync after await");

        return webText;
    }

    // Output: 
    //   In GetWebPageAsync before await 
    //   In startButton_Click before await 
    //   In GetWebPageAsync after await 
    //   Characters received: 44306
}
4

5 回答 5

86

错误信息完全正确:Main()方法 cannot be async,因为Main()返回时,应用程序通常会结束。

如果您想制作一个使用 的控制台应用程序async,一个简单的解决方案是创建一个async版本并在其上Main()同步地创建一个版本:Wait()Main()

static void Main()
{
    MainAsync().Wait();
}

static async Task MainAsync()
{
    // your async code here
}

这是混合的少数情况之一,await并且Wait()是一个好主意,您通常不应该这样做。

更新C# 7.1 支持Async Main

于 2013-05-23T12:20:00.537 回答
19

从 C# 7.1 开始,有 4 个新的Main方法签名允许创建它asyncSourceSource 2Source 3):

public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);

您可以使用关键字标记您的Main方法并在内部使用:asyncawaitMain

static async Task Main(string[] args)
{
    Task<string> getWebPageTask = GetWebPageAsync("http://msdn.microsoft.com");

    Debug.WriteLine("In startButton_Click before await");
    string webText = await getWebPageTask;
    Debug.WriteLine("Characters received: " + webText.Length.ToString()); 
}

C# 7.1 在 Visual Studio 2017 15.3 中可用。

于 2017-08-27T20:16:00.383 回答
2

我正在使用 C# 8,它工作正常。

static async Task Main(string[] args)
{
   var response = await SomeAsyncFunc();
   Console.WriteLine("Async response", response);
}

或者没有“await”关键字。

static void Main(string[] args)
{
   var response = SomeAsyncFunc().GetAwaiter().GetResult();
   Console.WriteLine("Async response", response);
}
于 2020-04-26T15:50:29.843 回答
1

链接示例中的代码与您的代码之间的区别在于您尝试Main()使用修饰符标记该方法async- 这是不允许的,并且错误说明了这一点 - 该Main()方法是应用程序的“入口点”(它是您的应用程序启动时执行的方法),并且不允许是async.

于 2013-05-23T11:03:01.417 回答
1

包装你的异步代码MainAsync()- 这是一个异步函数
然后调用MainAsync().GetAwaiter().GetResult();

于 2018-02-13T08:50:15.197 回答