C# 异步任务,在主线程中等待完成
我已经为这个任务建立了非常详细的示例,它在架构和一些.NET使用方面可能写得很差,但我才刚刚开始 例如: 这里有问题的代码是主要方法:C# 异步任务,在主线程中等待完成,c#,.net,asynchronous,mono,.net-4.5,C#,.net,Asynchronous,Mono,.net 4.5,我已经为这个任务建立了非常详细的示例,它在架构和一些.NET使用方面可能写得很差,但我才刚刚开始 例如: 这里有问题的代码是主要方法: public static void Main (string[] args) { Log("Initializing..."); // Define listeners. TcpListener s1 = CreateAndStartServer(IPAddress.Any, 1337); TcpListener s2 = C
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
,但这不是我想要的行为
还有哪些选项可以等待“无事可做”状态?尝试使用以下代码:
...
// 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,以便它阻塞,直到应用程序终止 简单的解决方案是在主线程循环中使用
Thread.Sleep(1000)
您还可以将任务标记为
前台线程
。当所有前台线程都处于活动状态时,应用程序保持活动状态。阅读有关前台和后台线程的更多信息
。另外,请看一下如何使任务成为前台线程 我想不惜一切代价避免线程睡眠,而前台/后台任务似乎可以帮我解决这个问题。将看到。不工作,应用程序在启动后立即停止(没有首先停止TCP侦听器)。当然,在应用程序需要终止之前,Accept必须处于阻塞状态…嗯,我想是的-有关于如何使其阻塞的示例吗?抱歉,没有正确阅读您的代码。您需要在accept方法中实现一个accept循环……它位于pastebin linked@question中,但这里是链接的副本,您可以在这里找到accept
: