首页 > 解决方案 > 部署在 Ubuntu 18.04 上的 .net-core 2.1 控制台应用程序的行为与 Windows 10 不同(可能是线程问题)

问题描述

在过去的几天里,我一直在努力解决一个非常奇怪的问题。我有一个 .net-core 2.1 控制台应用程序,该应用程序已在 Windows 10 上进行了全面测试,并且可以在那里完美运行。然而,当为 Ubuntu 18.04 部署它并在那里运行它时,应用程序开始出现奇怪的行为。我像这样部署它:

dotnet publish .\MyProject.csproj -c Release -r ubuntu.18.04-x64 --output ./published

控制台应用程序本质上是每秒运行一个函数,该函数使用 ThreadPool 类运行多个线程(最多 4 个)。线程池中的每个线程都进行一些计算并将结果写入数据库。线程相互独立,不通信,不等待其他线程完成,使用同一类的不同实例进行计算和数据库写入。这是每秒调用线程的方式:

foreach (var item in items)
{
    ThreadPool.QueueUserWorkItem(obj =>
    {
         DoTheCalcAndWriteToDb();
    });
}

在 Windows 上工作的预期输出是每个线程将其结果打印到控制台并打印为其运行函数的第二个线程。这是第二个 45 和 46 的日志示例:

Thread 1 info: Function done in second: 45:464
Thread 2 info: Function done in second: 45:464
Thread 3 info: Function done in second: 45:484
Thread 4 info: Function done in second: 45:504
---
Thread 1 info: Function done in second: 46:445
Thread 2 info: Function done in second: 46:445
Thread 3 info: Function done in second: 46:454
Thread 4 info: Function done in second: 46:485

如您所见,每个线程每秒都通过 ThreadPool 调用,并在同一秒完成。

现在 Linux (Ubuntu) 上的行为完全不同。运行它几秒钟会得到相同的结果,并且似乎与在 Windows 上一样工作,但几分钟后(绝不是同一时间),日志变得不一致。有些会在几秒钟后打印,有些则根本不打印。问题开始后,他们永远不会回到正常状态。当然,不仅仅是打印,数据库也没有每秒插入新数据(它应该每秒有 4 个新字段)。

对于有限的信息,我很抱歉,但我目前无法确定问题出在哪里或提供哪些其他信息来找出导致问题的原因。

有谁知道问题可能出在哪里?我可以提供有关计算和数据库工作的更多信息,但这真的没什么特别的,只是一些数学,然后将其写入 RethinkDB 中的一个新字段。

标签: c#multithreading.net-coreubuntu-18.04

解决方案


推荐阅读