C# 10 Pocket Reference中Task示例在Ubuntu环境下无法正常输出
问题解决:Task示例无输出及.NET 5 GLIBC依赖问题
一、Task示例无输出的原因与修复
你的代码逻辑本身没问题,但控制台程序的主线会在启动后台任务后直接退出,不等OnCompleted中的续代码执行。因为Task.Run会把计算放到线程池线程,主线程跑完所有同步代码就结束了,后台线程还没来得及完成计算或执行Console.WriteLine。
修复方案(任选其一)
主线程等待任务完成
在代码最后添加task.Wait();,强制主线程等待任务结束:Task<int> task = ComplexCalculationAsync(); var awaiter = task.GetAwaiter(); awaiter.OnCompleted(() => // Continuation { int result = awaiter.GetResult(); Console.WriteLine(result); // 116 }); task.Wait(); // 等待任务完成 Task<int> ComplexCalculationAsync() => Task.Run(() => ComplexCalculation()); int ComplexCalculation() { double x = 2; for (int i = 1; i < 100000000; i++) x += Math.Sqrt(x) / i; return (int)x; }改用async/await(更符合现代C#写法)
把Main方法改成异步,直接用await等待任务,这是更推荐的方式:using System; using System.Threading.Tasks; class Program { static async Task Main() { int result = await ComplexCalculationAsync(); Console.WriteLine(result); // 116 } static Task<int> ComplexCalculationAsync() => Task.Run(() => ComplexCalculation()); static int ComplexCalculation() { double x = 2; for (int i = 1; i < 100000000; i++) x += Math.Sqrt(x) / i; return (int)x; } }让主线程保持运行
在代码最后添加Console.ReadKey();,等待用户输入后再退出,确保后台任务有时间执行:// ... 原有代码 ... Console.ReadKey();
二、.NET 5 GLIBC依赖缺失问题
Ubuntu 22.04默认使用GLIBC 2.35,而.NET 5的运行时依赖的GLIBC版本较低(部分版本依赖2.31及以下),导致兼容性问题。解决办法:
- 优先使用.NET 6:你已经有.NET 6.0.11环境,它完全兼容Ubuntu 22.04,没必要再用.NET 5。
- 若必须用.NET 5:安装GLIBC兼容包,或者使用.NET 5的独立部署版本(self-contained deployment),打包时包含所有依赖,不依赖系统GLIBC。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

