当前位置:  开发笔记 > 编程语言 > 正文

为什么main不等到异步方法完成?

如何解决《为什么main不等到异步方法完成?》经验,为你挑选了1个好方法。

我有这个控制台应用程序,我的应用程序的缩减示例,但它允许重现行为.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Start");
            addAsync01(1, 2);
        }
        catch
        {
        }
        finally
        {
            Console.WriteLine("Finally");
            Console.ReadKey();
        }
        addAsync01(1,2);
    }

    private static async void addAsync01(int sum1, int sum2)
    {
        int result = await AddAsync(sum1, sum2);
        Console.WriteLine("El resultado de sumar 1 y 2 es: " + result);
    }

    public static async Task AddAsync(int num1, int num2)
    {
        return await Task.Run(() =>
        {
            return num1 + num2;
        });
    }
}

在该addSyn01方法中,我使用了await关键字,但是应用程序不会等到方法AddAsync完成,继续运行,因此我在控制台中获得的结果是:

Start
Finally
El resultado de sumar 1 y 2 es: 3

我期待这个:

Start
El resultado de sumar 1 y 2 es: 3
Finally

如果我没有错,方法完成的await关键字等待async继续下一行代码.

如果我在AddAsync01方法中使用此代码,它可以正常工作:

private static async void addAsync01(int sum1, int sum2)
{
    Task tskResult = AddAsync(1, 2);
    await Task.WhenAll(tskResult);

    Console.WriteLine("El resultado de sumar 1 y 2 es: " + tskResult.Result);
}

David Pine.. 12

控制台应用程序不支持应用程序async / await的入口点,正如您可能期望的那样.您需要调用.Wait()或(.Result对于Task返回方法).我建议您查看Stephen Cleary的异步控制台程序,如果您对它为何无法正常工作感到好奇.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Start");

            addAsync01(1, 2).Wait();
        }
        catch
        {
            //TODO
        }
        finally
        {
            Console.WriteLine("Finally");
            Console.ReadKey();
        }
        addAsync01(1, 2).Wait();
    }

    static async Task addAsync01(int sum1, int sum2)
    {
        int result = await AddAsync(sum1, sum2);
        Console.WriteLine("El resultado de sumar 1 y 2 es: " + result);
    }

    public static async Task AddAsync(int num1, int num2)
    {
        return await Task.Run(() => num1 + num2);
    }
}

此外,您需要返回TaskaddAsync01方法.

以下是带有更改的输出:

Start
El resultado de sumar 1 y 2 es: 3
Finally

虽然这种改变确实可以正常回答你的问题,但我很奇怪你想要引入异步代码而没有明显的原因.如果你只是想了解它是如何运作的,那很好; 但是,如果这是理想的代码,您可能需要重新考虑该方法.两者的总和在int's计算上并不昂贵,并且这可以以更快的速度和更少的开销同步完成.



1> David Pine..:

控制台应用程序不支持应用程序async / await的入口点,正如您可能期望的那样.您需要调用.Wait()或(.Result对于Task返回方法).我建议您查看Stephen Cleary的异步控制台程序,如果您对它为何无法正常工作感到好奇.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Start");

            addAsync01(1, 2).Wait();
        }
        catch
        {
            //TODO
        }
        finally
        {
            Console.WriteLine("Finally");
            Console.ReadKey();
        }
        addAsync01(1, 2).Wait();
    }

    static async Task addAsync01(int sum1, int sum2)
    {
        int result = await AddAsync(sum1, sum2);
        Console.WriteLine("El resultado de sumar 1 y 2 es: " + result);
    }

    public static async Task AddAsync(int num1, int num2)
    {
        return await Task.Run(() => num1 + num2);
    }
}

此外,您需要返回TaskaddAsync01方法.

以下是带有更改的输出:

Start
El resultado de sumar 1 y 2 es: 3
Finally

虽然这种改变确实可以正常回答你的问题,但我很奇怪你想要引入异步代码而没有明显的原因.如果你只是想了解它是如何运作的,那很好; 但是,如果这是理想的代码,您可能需要重新考虑该方法.两者的总和在int's计算上并不昂贵,并且这可以以更快的速度和更少的开销同步完成.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有