.net Windows服务多线程问题线程无法正常工作

qvsjd97n  于 2023-05-30  发布在  .NET
关注(0)|答案(1)|浏览(237)

我正在使用一个Windows服务,我们正在将设备连接到设备读取器。
1.服务需要所有离线设备
1.服务创建一个线程列表,并为每个设备创建一个线程和睡眠1秒。然后为另一个设备创建线程并将其添加到列表中。例如,如果有10个设备,其中7个在线,则将创建7个线程,差距为1秒。
1.之后,线程将睡眠5分钟,然后再次恢复,并重新检查离线设备,并将其添加到线程,如果有任何新的设备上线。

private static async void StartDeviceConnections()
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            var threads = new List<Thread>();
            var onlyOffline = false;
            setupDeviceTimer();
            setupSyncLogsTimer();
            nextCycle:
            try
            {
                var objDevice = new DeviceService();
                objDevice.UpdateDeviceStatus(0, DeviceStatuses.Offline, "updateAll");
                var devices = new DeviceService().GetOfflineIRISDevices();
                if (devices != null && devices.Count > 0)
                {
                    foreach (var device in devices)
                    {
                        Thread childThread = new Thread(new ThreadStart(delegate () { DeviceSyncManager(device); }));
                        childThread.Start();
                        childThread.Name = device.ipAddress;
                        threads.Add(childThread);
                        Thread.Sleep(1000);
                    }
                }
            }
            catch (Exception e)
            {

            }
            // wait for the next cycle
            Thread.Sleep(MinutesToCheckDeviceStatusAgain * 60 * 1000);
            onlyOffline = true;
             goto nextCycle;
        }

但它似乎是不工作的罚款,当我试图运行服务,我得到这个错误。
Windows无法在本地计算机上启动服务。错误1053:服务没有及时响应启动或控制
这段代码运行的唯一方法是注解后藤语句行。但是这样它将不会重新检查在线设备,并且不能保持在线状态。
我也试着改变睡眠的价值。时间真的很短,我不能尝试太多。我有另一个想法来修改代码,但这需要时间。

h5qlskok

h5qlskok1#

这是因为您的StartDeviceConnections永远不会结束。如果需要此代码连续运行,可以在另一个线程中执行。就像这样:

private static void StartDeviceConnections()
    {
        new Thread(() => {
          //the code that is currently in the StartDeviceConnections
    }).Start();
}

相关问题