gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:56:01 25 4
gpt4 key购买 nike

我需要在完成多种方法后生成报告。但在此示例中,它们不是异步的。

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com