gpt4 book ai didi

c# - while(true) 或 tcp 监听 : what is more efficient?

转载 作者:行者123 更新时间:2023-11-30 19:50:40 24 4
gpt4 key购买 nike

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

  1. 一个选项是池化:使用无限循环,例如同时(真)
  2. 或者,TCP 是否监听超时时间相对较长的端口。

我想知道这两种技术中的哪一种更有效,还能让我的应用程序保持事件状态?

我觉得执行 while(true) 会是一个 killer ,而 tcp listen 可能是一个健康的选择,因为 tcp listen 会使用硬件中断?

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

PS:我已经在此处考虑了 msmq 选项(相当于 tcp listen),但我不想依赖 msmq。

最佳答案

除非你真的在等待 TCP/IP 端口上发生的事情,否则你不应该(滥用)使用 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();
}
}
}

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

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

int signalledHandle = WaitHandle.WaitAny(handles);

或者,您可以引入一个简单的 bool 值并重用同一事件。如果您想确保在停止之前处理所有任务,这实际上可能更可取。

关于c# - while(true) 或 tcp 监听 : what is more efficient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com