我希望我的程序能够持续等待触发器以执行下一个任务.
我想知道这两种技术中的哪一种更有效,同时保持我的应用程序活着?
我觉得执行虽然(true)将是一个杀手,而tcp listen可能是一个健康选项,因为tcp listen会使用硬件中断?
此外,在.net winform应用程序中,我们使用Application.Run()方法使应用程序保持活动状态.如果有人知道这个方法在内部做什么分享.
PS:我已经在这里考虑了msmq选项(这相当于tcp listen)但我不想依赖msmq.
除非您实际上在等待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)
或者,您可以引入一个简单的布尔值并重用相同的事件.如果您想在停止之前确保处理所有任务,那么这实际上可能是首选.
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |