所以我有一个带有SocketAsyncEventArgs
池的IOCP项目,使它们可以重复使用,减少了SocketAsyncEventArgs.
我假设当调用 SocketAsyncEventArgs.Completed 事件时,保持可重用(未处理),链中挂钩的Completed事件不会自动设置为null。 因此,如果我不希望多次触发特定事件,我必须手动清理事件。
我对SocketAsyncEventArgs.Completed的假设是否正确?还是有点内部管理?
下面的代码可能会更清楚地解释:
void Foo(SocketAsyncEventArgs e) // Call-back
{
DoJob(e);
// Should I do it?
// e.Completed -= Foo;
}
提前致谢。
答案 0 :(得分:2)
使用SocketAsyncEventArgs
类的正确方法是在创建实例时添加处理程序一次。完成后,您只需将实例返回池中。你不需要删除处理程序;当您从池中提取新实例时,您只是不再添加处理程序 。
请勿忘记还有其他字段 - 即与您正在处理的特定完成情况相关的字段 - 您确实希望将其清除。完成当前操作后,可以在将实例返回到池之前清除它们,也可以等到下次使用它时从池中检索实例。恕我直言,最好在将值返回到池之前清除这些值,因为对于参考类型值,如果对象不再在其他地方使用,将确保对象是可收集的,而不是具有"幻像"来自您的池的引用使它们可以访问。