我正在实现一个WCF服务,该服务最终在它调用BeginExecuteReader
和BeginExecuteScalar
的数据库上运行一些存储过程。
我无法决定我需要哪种AsyncWaitHandle
实施。我想到了两个选择:
简单的一句:
public System.Threading.WaitHandle AsyncWaitHandle
{
get
{
return m_manualResentEvent;
}
}
使用锁来保护m_ManualResentEvent
public WaitHandle AsyncWaitHandle
{
get
{
if (m_manualResentEvent!= null)
{
return m_manualResetEvent;
}
lock (ThisLock)
{
if (m_manualResetEvent == null)
{
m_manualResetEvent = new ManualResetEvent(isCompleted);
}
}
return m_manualResetEvent;
}
}
答案 0 :(得分:1)
<强>更新强>
正如您在评论中提到的,您正在实施IAsyncResult。我可以找到来自Microsoft here和here的两个示例。在这两种情况下,他们都选择了两个。我只能认为它是这样做的,因为并不总是使用ManualResetEvent,因此它节省了资源,只在需要时创建。
<强>原始强>
第一个似乎没有机会进行线程争用(等待Lock)而不会丢失任何东西,据我所见。我假设在第一个选项中,ManualResetEvent是在构造函数中初始化的实例成员。如果是这样,我会选择第一个。
你有多大可能使用这个活动?如果它根本不可能,那么您可能需要考虑第二个,因为它将使您免于使用资源并且不太可能发生线程争用。
答案 1 :(得分:1)
WCF无论如何都不会使用该事件,因为这会破坏任何效率提升。如果您正在进行异步以获得效率和/或可伸缩性,请不要使用等待句柄。抛出NotImplementedException
。