异步在C#控制台应用程序? [重复] 异步在C#控制台应用程序? [重复](async at

2019-05-08 17:02发布

这个问题已经在这里有一个答案:

  • 不能指定一个控制台应用程序的“主”方法“异步”修改 15个回答

我有这个简单的代码:

public static async Task<int> SumTwoOperationsAsync()
{
    var firstTask = GetOperationOneAsync();
    var secondTask = GetOperationTwoAsync();
    return await firstTask + await secondTask;
}


private async Task<int> GetOperationOneAsync()
{
    await Task.Delay(500); // Just to simulate an operation taking time
    return 10;
}

private async Task<int> GetOperationTwoAsync()
{
    await Task.Delay(100); // Just to simulate an operation taking time
    return 5;
}

大。 这个编译。

但可以说,我有一个控制台应用程序,我想运行上面的代码(调用SumTwoOperationsAsync()

 static  void Main(string[] args)
        {
             SumTwoOperationsAsync();
        }

但我读过(当使用sync ),我不得不一路同步上下

:那么,这是否意味着我的Main功能应该被标记为async

那么它不可能是因为有一个编译错误:

一个入口点不能被打上了“异步”修饰符

如果我没有理解异步的东西,该线程将进入Main功能----> SumTwoOperationsAsync ---->将调用这两个函数,将缺阵。 但直到SumTwoOperationsAsync

我在想什么?

Answer 1:

在大多数项目类型,你的async “向上”和“向下”将在结束async void的事件处理程序或返回Task到你的框架。

然而,控制台应用程序不支持此功能。

您可以只是做一个Wait对返回的任务:

static void Main()
{
  MainAsync().Wait();
  // or, if you want to avoid exceptions being wrapped into AggregateException:
  //  MainAsync().GetAwaiter().GetResult();
}

static async Task MainAsync()
{
  ...
}

或者您可以使用自己的背景像我写的 :

static void Main()
{
  AsyncContext.Run(() => MainAsync());
}

static async Task MainAsync()
{
  ...
}

欲了解更多信息async控制台应用程序是在我的博客 。



Answer 2:

下面是做到这一点的最简单方法

static void Main(string[] args)
{
    Task t = MainAsync(args);
    t.Wait();
}

static async Task MainAsync(string[] args)
{
    await ...
}


Answer 3:

作为一个快速和非常作用域的解决方案:

Task.Result

用我用/ O,因为它们会导致调用线程阻塞保持等待I / O结束时,双方Task.Result和Task.Wait不会允许提高可扩展性。

当你打电话。结果在一个不完整的任务,执行该方法的线程有坐下来,等待任务完成,阻断从做任何其他有用的工作,在此期间该线程。 这否定了任务的异步性的好处。

notasync



Answer 4:

我的解决办法。 该JSONServer是一类我写在控制台窗口中运行的HttpListener服务器。

class Program
{
    public static JSONServer srv = null;

    static void Main(string[] args)
    {
        Console.WriteLine("NLPS Core Server");

        srv = new JSONServer(100);
        srv.Start();

        InputLoopProcessor();

        while(srv.IsRunning)
        {
            Thread.Sleep(250);
        }

    }

    private static async Task InputLoopProcessor()
    {
        string line = "";

        Console.WriteLine("Core NLPS Server: Started on port 8080. " + DateTime.Now);

        while(line != "quit")
        {
            Console.Write(": ");
            line = Console.ReadLine().ToLower();
            Console.WriteLine(line);

            if(line == "?" || line == "help")
            {
                Console.WriteLine("Core NLPS Server Help");
                Console.WriteLine("    ? or help: Show this help.");
                Console.WriteLine("    quit: Stop the server.");
            }
        }
        srv.Stop();
        Console.WriteLine("Core Processor done at " + DateTime.Now);

    }
}


文章来源: async at console app in C#? [duplicate]