2013-10-23 76 views
3

以下顺序是否合法?或者只有在EndAccept返回后才会调用下一个BeginAccept()?.NET:BeginAccept()可以在前一个EndAccept()完成之前调用吗?

listener.BeginAccept(AcceptCallback, null); 

private void AcceptCallback(IAsyncResult ar) 
{ 
    listener.BeginAccept(AcceptCallback, null); //Is this ok ? Or should happen only after next line? 
    socket = listener.EndAccept(ar); 

} 
+0

拥有多个未完成的接受是基础Windows API的常见使用模式 - 如果不支持这种情况,我会非常惊讶。 –

回答

2

我相信它是安全的基础上,为Socket class文件两个部分组成:

如果一个套接字上执行多个异步操作,也不用在订单不一定完全在他们开始。这个类的

实例是线程安全的。

也就是说,第一条评论没有列出任何警告过异步操作它是有效的有多个在同一时间。第二个注释比.NET框架中的类的通常线程保证要强大得多。

+0

*这个类的实例是线程安全的*不保证使用它的代码将是线程安全的 –

+0

@SriramSakthivel - 不,但它暗示一个线程可以调用'BeginAccept',无论其他线程可能处于什么状态 - 例如即使其他线程处于异步回调中,但尚未调用“EndAccept”。因此,可以在'EndAccept'之前调用'BeginAccept'的一般原则已经建立。 –

相关问题