while(true)或tcp listen:什么更有效率?

dot*_*der 2 c#

我希望我的程序能够持续等待触发器以执行下一个任务.

  1. 一种选择是汇集:使用无限循环,例如while(true)
  2. 或者,TCP是否侦听具有相对较高超时的端口.

我想知道这两种技术中的哪一种更有效,同时保持我的应用程序活着?

我觉得执行虽然(true)将是一个杀手,而tcp listen可能是一个健康选项,因为tcp listen会使用硬件中断?

此外,在.net winform应用程序中,我们使用Application.Run()方法使应用程序保持活动状态.如果有人知道这个方法在内部做什么分享.

PS:我已经在这里考虑了msmq选项(这相当于tcp listen)但我不想依赖msmq.

Tho*_*rin 5

除非您实际上在等待TCP/IP端口上发生的事情,否则您不应该(ab)使用Listen.

一种有效的方法是AutoResetEvent在您想要触发任务处理时发出信号.这将使你的线程睡眠,直到它需要做某事,而不进行任何轮询.

class TaskProcessor
{
    AutoResetEvent newTaskHandle = new AutoResetEvent(false);
    Queue<Task> taskQueue = new Queue<Task>();
    object syncRoot = new object();

    public void ProcessTasks()
    {
        while (true)
        {
            newTaskHandle.WaitOne();

            Task task = null;

            lock (syncRoot)
            {
                if (taskQueue.Count > 0)
                {
                    task = taskQueue.Dequeue();
                }
            }

            // Do task
        }
    }

    public void AddTask(Task task)
    {
        lock (syncRoot)
        {
            taskQueue.Enqueue(task);
            newTaskHandle.Set();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能会提出如何中止处理任务的问题.您可以使用多个WaitHandler(AutoResetEvent从中继承)并等待它们中的任何一个发生:

WaitHandle[] handles = new WaitHandle[] { newTaskHandle, stopHandle };

int signalledHandle = WaitHandle.WaitAny(handles);
Run Code Online (Sandbox Code Playgroud)

或者,您可以引入一个简单的布尔值并重用相同的事件.如果您想在停止之前确保处理所有任务,那么这实际上可能是首选.