【问题标题】:Asynchronous method does not work well in Console application异步方法在控制台应用程序中无法正常工作
【发布时间】:2021-08-02 11:45:28
【问题描述】:

我正在使用下面的代码,想测试一下并行编程,但是有一些问题。

using System;
using System.Threading.Tasks;

namespace DemoParallelApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*** Main Method Start ***");
            Operation();
            Console.WriteLine("*** Main Method End ***");
        }
        static void Operation()
        {
            Console.WriteLine("*** Operation Method Start ***");
            var task1 = Delay(5000);
            Console.WriteLine("*** Operation Method End ***");
        }

        static async Task<int> Delay(int ms)
        {
            Console.WriteLine($"Start {ms}(ms) Delay");
            await Task.Delay(ms);
            Console.WriteLine($"End {ms}(ms) Delay");
            return ms;
        }
    }
}

结果是这样的:

*** Main Method Start ***
*** Operation Method Start
*** Start 5000(ms) Delay
*** Operation Method End ***
*** Main Method End ***

但我觉得应该是这样的:

*** Main Method Start ***
*** Operation Method Start ***
Start 5000(ms) Delay
*** Operation Method End ***
*** Main Method End ***
End 5000(ms) Delay

这有什么问题?

【问题讨论】:

标签: c# asynchronous .net-core parallel-processing console-application


【解决方案1】:

您的程序在Wait 之前完成并终止(包括“等待”方法)。您需要在某处等待Delay 返回的任务。要获得所需的输出,您可以这样做,例如(使用 C# 7.1 async Main feature):

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("*** Main Method Start ***");
        var t = Operation();
        Console.WriteLine("*** Main Method End ***");
        await t;
    }
    static Task Operation()
    {
        Console.WriteLine("*** Operation Method Start ***");
         var task1 = Delay(5000);
        Console.WriteLine("*** Operation Method End ***");
         return task1 ;
    }

    static async Task<int> Delay(int ms)
    {
        Console.WriteLine($"Start {ms}(ms) Delay");
        await Task.Delay(ms);
        Console.WriteLine($"End {ms}(ms) Delay");
        return ms;
    }
}

【讨论】:

    【解决方案2】:

    你需要等待延迟:

    static async Task Operation()
    {
        Console.WriteLine("*** Operation Method Start ***");
        var task1 = await Delay(5000);
        Console.WriteLine("*** Operation Method End ***");
    }
    

    并使用 await 调用 Operation,在您的情况下,main 方法不是 asyncable,您可以这样做:

    Task.Run(() => Operation()).GetAwaiter().GetResult();
    

    【讨论】:

    • 这无济于事,因为 Operationvoid 并且没有等待。
    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2020-04-12
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多