任务比预期提前完成

本文关键字:提前完成 任务 | 更新日期: 2023-09-27 17:55:59

我有这个方法:私有静态异步任务 MyMethod();它以这种方式调用:

public static void Main()
{
s_Finishing = false;
Task printTask = PrintStatistics();
MyMethod(serversSawa, serversSterling).Wait();
s_Finishing = true;
}

我希望PrintStatistics只有在MyMethod完成后才会停止运行。但不幸的是,事实并非如此。如果我评论该行s_Finishing = true;任务将永远运行 - 并允许完成 MyMethod如何解决问题?

private static async Task PrintStatistics()
            {
                while (!s_Finishing)
                {
                    long total = 0;
                    await Task.Delay(TimeSpan.FromSeconds(20));
                    foreach (var statistic in s_Statistics)
                    {
                        ToolsTracer.Trace("{0}:{1}", statistic.Key, statistic.Value);
                        total += statistic.Value;
                    }
                    foreach (var statistic in s_StatisticsRegion)
                    {
                        ToolsTracer.Trace("{0}:{1}", statistic.Key, statistic.Value);
                    }
                    ToolsTracer.Trace("TOTAL:{0}", total);
                    ToolsTracer.Trace("TIME:{0}", s_StopWatch.Elapsed);
                }
            }
private static async Task MyMethod()
{
Parallel.ForEach(
                        data,
                        new ParallelOptions { MaxDegreeOfParallelism = 20 }, async serverAndCluster =>
                        {
                            await someMethod()                        });
}

任务比预期提前完成

我相信

你的问题就在这里:

Parallel.ForEach(..., async ...);

您不能将asyncForEach一起使用。需要在同一方法中同时执行并行(CPU 绑定)和async(I/O 绑定)的情况极为罕见。如果您只想要并发(我怀疑),请使用 Task.WhenAll 而不是 ForEach .如果您确实需要 CPU 并行性和async,请使用 TPL 数据流。