许多方法完成后,我需要生成一份报告。但在此示例中,它们不是异步的。
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/