C# BeginAccept(new AsyncCallback(OnAccept), socket) 15
1我想问的是AsyncCallback这个系统定义好的委托什么时候会触发呢?也就是说在开始异步调用的时候,什么时候OnAccept这个函数会被调用呢?2我自己试验的是当有...
1 我想问的是AsyncCallback这个系统定义好的委托什么时候会触发呢?也就是说在开始异步调用的时候,什 么时候OnAccept这个函数会被调用呢?
2 我自己试验的是当有别的socket去连接的时候,或者有socket释放资源的时候,委托会触发
3 是否还有其他情况去触发呢。
对这个委托不是很了解。谢谢 展开
2 我自己试验的是当有别的socket去连接的时候,或者有socket释放资源的时候,委托会触发
3 是否还有其他情况去触发呢。
对这个委托不是很了解。谢谢 展开
2个回答
展开全部
Socket.BeginAccept 方法 (AsyncCallback, Object)
.NET Framework 4.6 and 4.5
其他版本
开始一个异步操作来接受一个传入的连接尝试。
命名空间: System.Net.Sockets
程序集: System(在 System.dll 中)
语法
C#
C++
F#
VB
[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginAccept(
AsyncCallback callback,
Object state
)
参数
callback
类型:System.AsyncCallback
AsyncCallback 委托。
state
类型:System.Object
一个对象,它包含此请求的状态信息。
返回值
类型:System.IAsyncResult
一个 IAsyncResult,它引用异步 Socket 创建。
异常
异常
条件
ObjectDisposedException
Socket 对象已关闭。
NotSupportedException
此方法需要 Windows NT。
InvalidOperationException
正在接受的套接字不会侦听连接。 在调用 BeginAccept 之前必须调用 Bind 和 Listen。
- 或 -
已接受的套接字是绑定的。
ArgumentOutOfRangeException
receiveSize 小于 0。
SocketException
试图访问套接字时发生错误。 有关更多信息,请参见备注部分。
备注
面向连接的协议可以使用 BeginAccept 方法来异步处理传入的连接尝试。 以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据。 在调用 BeginAccept 方法之前,必须调用 Listen 方法来侦听传入的连接请求,并将侦听到的请求放入队列中。
必须创建实现 AsyncCallback 委托的回调方法,并将其名称传递给 BeginAccept 方法。 若要实现这一点,至少必须通过 state 参数将实施侦听的 Socket 对象传递给 BeginAccept。 如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。 通过 state 参数将此类的一个实例传递给 BeginAccept 方法。
回调方法应调用 EndAccept 方法。 当应用程序调用 BeginAccept时,系统会在 EndAccept 通常使用不同的线程上执行指定的回调方法并阻止,直到挂起的连接进行检索。 EndAccept 将返回新的 Socket 对象,供您用来向远程主机发送数据和从远程主机接收数据。 不能使用返回的这个 Socket 接受连接队列中的任何附加连接。 如果想要在调用 BeginAccept 方法后使原始线程阻止,请使用 WaitHandle.WaitOne。 当需要原始线程继续执行时,请在回调方法中调用 ManualResetEvent 的 Set 方法。
该系统还可以使用调用的线程调用回调方法。 在这种情况下,在返回的 IAsyncResult 的 CompletedSynchronously 属性将设置指示 BeginAccept 方法同步完成。
有关编写回调方法的其他信息,请参见 “回调”示例。
若要取消 BeginAccept 方法的挂起调用,则关闭 Socket。 在 Close 方法调用时,同时异步操作正在进行,提供给 BeginAccept 方法的回调被调用。该 EndAccept 方法的后续调用将引发 ObjectDisposedException以指示该操作已取消。
说明
可以使用返回的 Socket 的 RemoteEndPoint 特性标识远程托管的网络地址和端口号。
说明
如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,可以参考 MSDN 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关此错误的详细说明。
说明
当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。 有关详细信息,请参阅 网络跟踪。
说明
执行上下文(安全上下文、模拟用户及调用上下文)会被缓存,以用于 Socket 异步方法。 在首次使用一个特定上下文(特定 Socket 异步方法、特定 Socket 实例及特定回调)后,该上下文的后续使用将得到性能改善。
说明
应用到HostProtectionAttribute 此类型或成员的特性具有以下Resources 属性值:ExternalThreading。这HostProtectionAttribute 不影响桌面应用程序(通常通过双击图标、键入命令或在浏览器中输入 URL 来启动这些应用程序)。有关更多信息,请参见HostProtectionAttribute 类或SQL Server 编程和宿主保护特性.
示例
下面的代码示例尝试异步接收传入连接。
C#
C++
VB
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);
Socket s = new Socket(lep.Address.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
try{
s.Bind(lep);
s.Listen(1000);
while(true){
allDone.Reset();
Console.WriteLine("Waiting for a connection...");
s.BeginAccept(new AsyncCallback(Async_Send_Receive.Listen_Callback), s);
allDone.WaitOne();
}
}
catch (Exception e){
Console.WriteLine(e.ToString());
}
版本信息
.NET Framework
受以下版本支持:4.5、4、3.5、3.0、2.0、1.1、1.0
.NET Framework Client Profile
受以下版本支持:4、3.5 SP1
平台
Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
并不是.NET Framework 对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求.
.NET Framework 4.6 and 4.5
其他版本
开始一个异步操作来接受一个传入的连接尝试。
命名空间: System.Net.Sockets
程序集: System(在 System.dll 中)
语法
C#
C++
F#
VB
[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginAccept(
AsyncCallback callback,
Object state
)
参数
callback
类型:System.AsyncCallback
AsyncCallback 委托。
state
类型:System.Object
一个对象,它包含此请求的状态信息。
返回值
类型:System.IAsyncResult
一个 IAsyncResult,它引用异步 Socket 创建。
异常
异常
条件
ObjectDisposedException
Socket 对象已关闭。
NotSupportedException
此方法需要 Windows NT。
InvalidOperationException
正在接受的套接字不会侦听连接。 在调用 BeginAccept 之前必须调用 Bind 和 Listen。
- 或 -
已接受的套接字是绑定的。
ArgumentOutOfRangeException
receiveSize 小于 0。
SocketException
试图访问套接字时发生错误。 有关更多信息,请参见备注部分。
备注
面向连接的协议可以使用 BeginAccept 方法来异步处理传入的连接尝试。 以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据。 在调用 BeginAccept 方法之前,必须调用 Listen 方法来侦听传入的连接请求,并将侦听到的请求放入队列中。
必须创建实现 AsyncCallback 委托的回调方法,并将其名称传递给 BeginAccept 方法。 若要实现这一点,至少必须通过 state 参数将实施侦听的 Socket 对象传递给 BeginAccept。 如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。 通过 state 参数将此类的一个实例传递给 BeginAccept 方法。
回调方法应调用 EndAccept 方法。 当应用程序调用 BeginAccept时,系统会在 EndAccept 通常使用不同的线程上执行指定的回调方法并阻止,直到挂起的连接进行检索。 EndAccept 将返回新的 Socket 对象,供您用来向远程主机发送数据和从远程主机接收数据。 不能使用返回的这个 Socket 接受连接队列中的任何附加连接。 如果想要在调用 BeginAccept 方法后使原始线程阻止,请使用 WaitHandle.WaitOne。 当需要原始线程继续执行时,请在回调方法中调用 ManualResetEvent 的 Set 方法。
该系统还可以使用调用的线程调用回调方法。 在这种情况下,在返回的 IAsyncResult 的 CompletedSynchronously 属性将设置指示 BeginAccept 方法同步完成。
有关编写回调方法的其他信息,请参见 “回调”示例。
若要取消 BeginAccept 方法的挂起调用,则关闭 Socket。 在 Close 方法调用时,同时异步操作正在进行,提供给 BeginAccept 方法的回调被调用。该 EndAccept 方法的后续调用将引发 ObjectDisposedException以指示该操作已取消。
说明
可以使用返回的 Socket 的 RemoteEndPoint 特性标识远程托管的网络地址和端口号。
说明
如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,可以参考 MSDN 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关此错误的详细说明。
说明
当应用程序中启用了网络跟踪时,此成员将输出跟踪信息。 有关详细信息,请参阅 网络跟踪。
说明
执行上下文(安全上下文、模拟用户及调用上下文)会被缓存,以用于 Socket 异步方法。 在首次使用一个特定上下文(特定 Socket 异步方法、特定 Socket 实例及特定回调)后,该上下文的后续使用将得到性能改善。
说明
应用到HostProtectionAttribute 此类型或成员的特性具有以下Resources 属性值:ExternalThreading。这HostProtectionAttribute 不影响桌面应用程序(通常通过双击图标、键入命令或在浏览器中输入 URL 来启动这些应用程序)。有关更多信息,请参见HostProtectionAttribute 类或SQL Server 编程和宿主保护特性.
示例
下面的代码示例尝试异步接收传入连接。
C#
C++
VB
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);
Socket s = new Socket(lep.Address.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
try{
s.Bind(lep);
s.Listen(1000);
while(true){
allDone.Reset();
Console.WriteLine("Waiting for a connection...");
s.BeginAccept(new AsyncCallback(Async_Send_Receive.Listen_Callback), s);
allDone.WaitOne();
}
}
catch (Exception e){
Console.WriteLine(e.ToString());
}
版本信息
.NET Framework
受以下版本支持:4.5、4、3.5、3.0、2.0、1.1、1.0
.NET Framework Client Profile
受以下版本支持:4、3.5 SP1
平台
Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
并不是.NET Framework 对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询