1

我有一个程序可以从串行设备中检索数据,然后将其放入服务器中,该服务器可由可以处理此协议的某些程序访问。此服务器是一个第三方程序,采用活动 x 控件的形式。

硬件设备需要一个 Thread.Sleep,这是不幸的。监视服务器的程序有时会在线程休眠期间查询服务器。这会导致它认为服务器出现故障。

我的下一个想法是将服务器放在一个单独的线程上,一个专门用于服务器任务的线程。在 UI 线程中,我运行以下代码:

        Thread workerThread = new Thread(DoServerWork);
        workerThread.SetApartmentState(ApartmentState.STA);
        workerThread.Start();

在代表中,我有

    public void DoServerWork()
    {
        rtu = new AxASMBSLVLib.AxASMBSLV();
        rtu.CreateControl();
        rtu.BeginInit();
        rtu.OpenPort();

        while (true)
        {

        }
    }

问题是服务器开始工作,然后在大约 5 秒内变得无响应。我最初的想法是线程正在退出,但是 while(true) 应该防止这种情况发生。有什么想法吗?

4

2 回答 2

2

由于您在单线程单元 (STA) 中运行它,因此一旦该线程遇到空的无限循环,就不会再发生任何事情了。无限循环通常不是一个好主意。您可能应该使用计时器在其 OnElapsed 事件处理程序中定期执行服务器工作。

于 2012-09-22T21:02:43.373 回答
0

它是来自第三方公司的 modbus TCP/IP 从站。第一个选项是将其从工具箱“拖放”到 GUI,使其位于 UI 线程上。

由于 ActiveX 需要 STA :完全正确。

我必须在 UI 线程上调用 Thread.Sleep,

that should never be necessary, here lies your real problem. Never block/sleep he main thread.

Your question should be about how to avoid the Sleep().

于 2012-09-23T10:27:03.230 回答