我正在实现一个WCF服务,它最终在一个称为BeginExecuteReader和BeginExecuteScalar的数据库上运行一些存储过程。我无法决定我需要哪个AsyncWaitHandle实现。我想了两个选择:
m_ManualResentEvent。
公共WaitHandle AsyncWaitHandle { get { if (m_manualResentEvent!= null) {返回m_manualResetEvent;} lock (ThisLock) { if (m_manualResetEvent == null) { m_manualResetEvent =新ManualResetEvent(isCompleted);}返回m_manualResetEvent;}}发布于 2014-01-19 08:55:01
更新
正如您在注释中提到的,您正在实现IAsyncResult。我可以从微软的这里和这里中找到两个样本。在这两种情况下,他们都选择了你的第二选择。我只能认为它是这样做的,因为ManualResetEvent并不总是被使用,所以它节省了资源,只在需要时才创建。
原始
就我所见,第一个线程争用线程的机会似乎更少(等待锁),而不会失去任何东西。我假设在第一个选项中,ManualResetEvent是在构造函数中初始化的实例成员。如果是这样的话,我会选择第一个。
你用这个事件的可能性有多大?如果根本不可能,那么您可能需要考虑第二个问题,因为它将帮助您避免消耗资源,并且线程争用是不可能的。
发布于 2014-01-19 12:15:11
WCF无论如何都不会使用该事件,因为这会破坏任何效率的提高。如果您正在执行异步以获得效率和/或可伸缩性,请不要使用等待句柄。扔一个NotImplementedException。
https://stackoverflow.com/questions/21214783
复制相似问题