Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 异步/等待套接字服务器OutOfMemoryException_C#_Sockets_.net 4.5_Out Of Memory_Async Await - Fatal编程技术网

C# 异步/等待套接字服务器OutOfMemoryException

C# 异步/等待套接字服务器OutOfMemoryException,c#,sockets,.net-4.5,out-of-memory,async-await,C#,Sockets,.net 4.5,Out Of Memory,Async Await,我正在编写一个套接字服务器,并试图利用新的async/await功能 我已经把我的代码建立起来了 我明白了 发生“System.OutOfMemoryException”类型的未处理异常 在mscorlib.dll中 下面的代码中是否有任何明显的内容 public void Main() { CancellationTokenSource cts = new CancellationTokenSource(); TcpListener listener = n

我正在编写一个套接字服务器,并试图利用新的
async/await
功能

我已经把我的代码建立起来了

我明白了

发生“System.OutOfMemoryException”类型的未处理异常 在mscorlib.dll中

下面的代码中是否有任何明显的内容

public void Main()
{          
    CancellationTokenSource cts = new CancellationTokenSource();
    TcpListener listener = new TcpListener(IPAddress.Any, 6666);

    listener.Start();

    while (true)
    {
        AcceptClientsAsync(listener, cts.Token);
    }

    cts.Cancel();
    listener.Stop();
}

async Task AcceptClientsAsync(TcpListener listener, CancellationToken ct)
{
    while (!ct.IsCancellationRequested)
    {
        TcpClient client = await listener.AcceptTcpClientAsync();
        Console.WriteLine("Client. Doing the do.");
        SomeTaskAsync(client, ct);
    }

}

async Task SomeTaskAsync(TcpClient client, CancellationToken ct)
{
    var stream = client.GetStream();

    while (!ct.IsCancellationRequested)
    {
        // Do Stuff

        stream.Close();
        client.Close();
    }
}

原始代码有一个睡眠:

try
{
    listener.Start();
    AcceptClientsAsync(listener, cts.Token);
    Thread.Sleep(60000);
}
其中有一个无限忙循环:

while (true)
{
    AcceptClientsAsync(listener, cts.Token);
}
在异步等待模式中无法执行此操作,对
AcceptClientsAsync
的调用会立即返回,最终导致一个繁忙的无限循环。怪不得你打了我


查看并查看侦听循环是如何等待循环中的事件的。你必须做类似的事情。例如,您可以在完成(接受)时提交新的侦听器。您的main必须等待,或者最好还是为服务器使用一个适当的模板:一个用于教育的服务流程。对于现实世界的使用,让框架为您列出繁重的清单,例如WCF。

谢谢您的回答。我应该在我的案例中使用异步等待模式吗?目的是简化代码。是的,async await仍然很好。MSDN示例中的异步示例可以很容易地移植到async await。更好的是,我确信有一个async Wait特定的示例。您可能认为会有一个示例,但到目前为止,我找不到。请参阅。