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

标签 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);
    }

如何让它们真正异步?

最佳答案

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

Task t1 = m1();
Task t2 = m2();

这是因为您此时既不等待调用,也不在内部等待。最终效果是标准方法调用。

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

以下修改将启动新任务,并将它们与可用于监视其完成情况的 Promise 相关联,然后像以前一样以异步方式 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);
}

不幸的是,我们没有展示异步等待的好处,因为我们同时没有做任何事情。

关于c# - 如何异步运行某些方法并捕获它们的结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17853407/

相关文章:

c# - Asp.Net MVC、WebApi 和正确的异步方法

javascript - NodeJS Express 应用程序 await 仅在异步函数中有效,但这显然是异步函数?

javascript - 使用 promise.All 和 await 循环遍历文件操作列表的正确方法

c# - 为什么没有人为 Winforms 编写 RadioMenuItems 类?

c# - 通过反射实例化时,将类型的实例添加到该类型的列表中

c# - WPF MVVM依赖属性获取负值

c# - 带有可取消 EventArgs 的 INotifyPropertyChanging EventHandler 中的异步/等待

c# - 在任务完成时使用不带异步的等待来处理任务

c# - 找出所有相同的答案

c# - 使用 ExecuteNonQuery c# 时出错