c# - .NET Core 任务在 OpenVZ 虚拟服务器上不起作用
问题描述
我注意到 .NET Core 3Task
无法在我的基于 Ubuntu 18.04 的虚拟服务器上运行(提供程序是 Strato.de 和 HostEurope.de)。
这是一个非常基本的测试程序:
static void Main(string[] args) {
Console.WriteLine("Hello");
Task.Delay(2000).ContinueWith(_ => Console.WriteLine("Fire"));
Thread.Sleep(5000);
Console.WriteLine("Exit");
}
应用程序应"Hello"
立即打印,然后在 2 秒后打印,"Fire"
最后打印"Exit"
。这在我的 Windows 计算机和我的 Ubuntu 18.04 计算机上都可以正常工作。
但是当我在虚拟服务器上运行代码时,第二条消息永远不会打印出来。也Threading.Timer
有Timers.Timer
同样的问题,他们几乎从不开火(有时,但很少,他们会)。
编辑:两个虚拟服务器都在OpenVZ上运行,至少这是这么systemd-detect-virt
说的。我相应地更改了问题的标题。
知道问题可能是什么吗?
解决方案
如果能够使用 asynchronous Main
,那么考虑以下
public static async Task Main(string[] args) {
Console.WriteLine("Hello");
var task1 = Task.Run(async () => {
await Task.Delay(2000);
Console.WriteLine("Fire");
});
var task2 = Task.Delay(5000);
await Task.WhenAll(task1, task2);
Console.WriteLine("Exit");
}
避免混合异步和阻塞调用,例如Task.Delay
和Thread.Sleep
分别。如果要异步,请一路走。
推荐阅读
- sql-server - TFS - 从 DB 中查询 Microsoft.VSTS.CMMI.RootCause,以使用 SSRS 生成报告
- angularjs - 如何将用户输入信息用于新帖子到服务器(AngularJS)
- java - 如何将 GitHub 存储库链接为 Maven 依赖项
- php - .htaccess 用于共享主机上的多个 laravel 安装
- java - 用于读取 Unix 和 Windows 换行符的 Java 扫描程序
- amazon-web-services - AWS 单个会话或多个会话?
- hyperledger-fabric - Hyperledger Fabric 最小化交易规模
- fabricjs - Fabric.js 将多个 JSON 添加到画布
- java - 在 Spring JPA/Java 中使用父类的现有记录
- android - 如何从android接收和返回webapp2中的字符串?