【发布时间】:2014-11-24 05:16:26
【问题描述】:
所以我有一个带有 SocketAsyncEventArgs 池的 IOCP 项目,这使得它们可以重复使用并减少了 SocketAsyncEventArgs. 的繁重分配任务
我假设当 SocketAsyncEventArgs.Completed 事件被调用时,保持可重用(未释放),链中挂钩的 Completed 事件不会自动设置为 null。 因此,如果我不想多次触发特定事件,我必须手动清理事件。
我对 SocketAsyncEventArgs.Completed 的假设是否正确?还是在某种程度上是内部管理的?
下面的代码可能解释的更清楚:
void Foo(SocketAsyncEventArgs e) // Call-back
{
DoJob(e);
// Should I do it?
// e.Completed -= Foo;
}
提前致谢。
【问题讨论】:
-
我对此一无所知,但由于没有其他人回答或评论:整个设计容易出现时序漏洞。如果您确实需要从 e.Completed 中删除事件处理程序以避免不必要的多次调用,那么您应该在调用 DoJob() 之前执行它,而不是之后。但即便如此,也可能存在时间漏洞。无论如何,这是现在开源的 .Net 的一部分吗?如果是这样,您可以在那里找到答案。
-
谢谢。可能我宁愿考虑更稳定的设计,我不必担心这样的事情,而不是尝试清除 Completed 事件。赞赏。