因此,我有一个带有SocketAsyncEventArgs池的IOCP项目,它使它们可以重用,并减少了SocketAsyncEventArgs.的繁重分配任务。
我假设当SocketAsyncEventArgs.Completed事件被调用时,保持可重用(未被释放),连接在链中的已完成的事件不会自动设置为null。因此,如果不希望多次触发特定事件,则必须手动清除事件。
我对SocketAsyncEventArgs.Completed的假设正确吗?或者它是内部管理的?
下面的代码可能会更清楚地解释:
void Foo(SocketAsyncEventArgs e) // Call-back
{
DoJob(e);
// Should I do it?
// e.Completed -= Foo;
}提前谢谢。
发布于 2014-11-24 08:13:38
使用SocketAsyncEventArgs类的正确方法是在创建实例时添加一次处理程序。完成后,您只需将实例返回到池。不需要删除处理程序;只是在从池中提取新实例时,不需要再次添加处理程序。
不要忘记还有其他字段--即那些与您正在处理的特定完成相关的字段--您确实希望被清除。完成当前操作后,可以在将实例返回到池之前清除它们,也可以等到下次使用时从池中检索实例。在将值返回到池之前,最好清除这些值,因为对于引用类型值,如果对象不再在其他地方使用,则可以确保它们是可收集的,而不是让池中的“幻影”引用保持其可访问性。
https://stackoverflow.com/questions/27098274
复制相似问题