Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步任务,在主线程中等待完成_C#_.net_Asynchronous_Mono_.net 4.5 - Fatal编程技术网

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

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

我已经为这个任务建立了非常详细的示例,它在架构和一些.NET使用方面可能写得很差,但我才刚刚开始

例如:

这里有问题的代码是主要方法:

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