异步任务,在主线程中等待完成

时间:2014-05-29 11:08:37

标签: c# .net asynchronous mono .net-4.5

我为此任务设置了非常详细的示例,它可能在架构和一些.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.ReadKeyConsole.ReadLine,但这不是我正在寻找的行为。

还有什么其他选择可以等待"没有什么可做的"状态?

2 个答案:

答案 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,了解如何将任务作为前台线程。