此send方法将定期失败,因为控制权已返回给调用线程,并Send
在套接字打开时再次被调用。
我正在使用Stephen Toub的课程:http : //blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx
这将导致异常:在已连接的套接字上发出了连接请求。
确保异步方法不会遭受这种命运的正确方法是什么?基本上,发送实际上无法在建立连接之前完成。
public async Task Send(byte[] tosend)
{
// this code is not correct / not thread safe.
if (this.socket.Connected)
await this.StartSending(tosend);
else
await StartConnecting(tosend);
}
private async Task StartSending(byte[] tosend)
{
var args = new SocketAsyncEventArgs();
args.SetBuffer(tosend, 0, tosend.Length);
var awaitable = new SocketAwaitable(args);
await this.socket.SendAsync(awaitable);
}
private async Task StartConnecting(byte[] tosend)
{
var local = Dns.GetHostEntry(Dns.GetHostName());
var ep = new IPEndPoint(local.AddressList.First(_ => _.AddressFamily == AddressFamily.InterNetwork), this.port);
var args = new SocketAsyncEventArgs() { RemoteEndPoint = ep };
var awaitable = new SocketAwaitable(args);
await this.socket.ConnectAsync(awaitable);
await StartSending(tosend);
}
我的测试Send
连续非常快地打电话给我。
var sends = arrays.Select(_ => writer.Send(_)).ToArray();
Task.WaitAll(sends);
有时,上面的代码可以正常工作,并且套接字已连接,socket.Connected
设置为true“ on time”。在其他时候,多次调用会this.socket.ConnectAsync
发生。
Send
应该等待对的调用,以便您知道已建立连接,也要知道您的数据是按顺序发送的。最好由foreach
循环处理而不是.Select
。
foreach (var data in arrays)
await writer.Send(data);
大概您创建了变量,sends
以便可以Task.WhenAll
对其进行操作。不幸的是,由于您已经发现的原因,这将不起作用。你可能有所谓的一个单独的方法解决这个问题Connect
是异步-LY连接到远程主机但没有发送数据。然后,您可以执行以下操作:
await writer.Connect();
var sends = arrays.Select(_ => writer.Send(_)).ToArray();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句