我为此任务设置了非常详细的示例,它可能在架构和一些.NET使用方面写得不好,但我刚刚开始。
示例:http://pastebin.com/uhBGWC5e
这里有问题的代码是Main方法:
public static void Main (string[] args)
{
Log("Initializing...");
// Define listeners.
TcpListener s1 = CreateAndStartServer(IPAddress.Any, 1337);
TcpListener s2 = CreateAndStartServer(IPAddress.Any, 1338);
// Start async.
Task.Factory.StartNew(Accept, s1);
Task.Factory.StartNew(Accept, s2);
// Wait for connections only if servers active.
while (servers.Any(s => s.Key.Active))
{
// 100% usage.
}
Log("Nothing left to do, stopping service.");
}
更具体地说," while"循环。
我在这里尝试做的是,创建并启动一些TCP侦听器,并将它们添加到列表中。
然后,服务器本身有一个允许远程关闭的实现。
循环用于检查程序是否有一些工作要做。如果没有什么可做的,它应该退出。 (将来当我开始实际实现时,TCP侦听器会有一些UDP,任务队列,定时器等等等等等等等等。
问题是,while循环导致100%使用 - 它提供了功能,但确实消耗太多。我可以将其替换为Console.ReadKey
或Console.ReadLine
,但这不是我正在寻找的行为。
还有什么其他选择可以等待"没有什么可做的"状态?
答案 0 :(得分:1)
尝试使用此代码:
...
// Start async.
var task1 = Task.Factory.StartNew(Accept, s1);
var task2 = Task.Factory.StartNew(Accept, s2);
Task.WhenAll(task1, task2).Wait();
Log("Nothing left to do, stopping service.");
}
这应该做同样但不使用100%CPU。但是你必须实现Accept,以便它阻塞直到应用程序终止。
答案 1 :(得分:-1)
简单的解决方案是在主线程循环中使用Thread.Sleep(1000)
。
您还可以将任务标记为foreground threads
。所有前台线程都处于活动状态时,应用程序保持活动状详细了解foreground and background threads
here。另请参阅this question,了解如何将任务作为前台线程。