如何运行某些方法异步并捕获它们的结尾?

Fre*_*ice 2 c# async-await

一旦完成了许多方法,我需要生成报告.但在这个示例中,它们不是异步的.

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

    async static void TaskMan()
    {
        Task t1 = m1();
        Task t2 = m2();
        await Task.WhenAll(t1, t2);
        Console.WriteLine("Complete");
    }

    async static Task m1()
    {
        decimal result = 0;
        for (int n = 1; n < 100000000; n++)
        {
            result += n;
        }
        Console.WriteLine(result);
    }

    async static Task m2()
    {
        decimal result = 0;
        for (int n = 1; n < 100000000; n++)
        {
            result += n;
        }
        Console.WriteLine(result);
    }
Run Code Online (Sandbox Code Playgroud)

怎么做真的异步?

Ada*_*rth 5

首先,它不是异步运行的,因为在这些行中,您实际上是以非异步方式调用方法:

Task t1 = m1();
Task t2 = m2();
Run Code Online (Sandbox Code Playgroud)

这是因为你既没有等待此时的呼叫,也没有在内部等待.净效应是标准方法调用.

其次,async并不一定意味着在另一个线程上.

以下修订将启动新任务并将它们与您可用于监视其完成的承诺相关联,然后您WhenAll将以异步方式与之前相关联.请注意,任务将开始StartNew,而不是开启WhenAll.

async static void TaskMan()
{
    Task t1 = Task.Run((Action)m1);
    Task t2 = Task.Run((Action)m2);

    await Task.WhenAll(t1, t2);
    Console.WriteLine("Compete");
}

static void m1()
{
    decimal result = 0;
    for (int n = 1; n < 100000000; n++)
    {
        result += n;
    }
    Console.WriteLine(result);
}

static void m2()
{
    decimal result = 0;
    for (int n = 1; n < 100000000; n++)
    {
        result += n;
    }
    Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我们没有证明异步等待的好处,因为我们在同一时间没有做任何事情.