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特定的示例。您可能认为会有一个示例,但到目前为止,我找不到。请参阅。