WaitHandle AsyncWaitHandle

时间:2014-01-19 08:48:04

标签: c# wcf asynchronous

我正在实现一个WCF服务,该服务最终在它调用BeginExecuteReaderBeginExecuteScalar的数据库上运行一些存储过程。 我无法决定我需要哪种AsyncWaitHandle实施。我想到了两个选择:

  1. 简单的一句:

    public System.Threading.WaitHandle AsyncWaitHandle
    {
        get
        {
            return m_manualResentEvent;
        }
    }
    
  2. 使用锁来保护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;
        }
    }
    

2 个答案:

答案 0 :(得分:1)

<强>更新

正如您在评论中提到的,您正在实施IAsyncResult。我可以找到来自Microsoft herehere的两个示例。在这两种情况下,他们都选择了两个。我只能认为它是这样做的,因为并不总是使用ManualResetEvent,因此它节省了资源,只在需要时创建。

<强>原始

第一个似乎没有机会进行线程争用(等待Lock)而不会丢失任何东西,据我所见。我假设在第一个选项中,ManualResetEvent是在构造函数中初始化的实例成员。如果是这样,我会选择第一个。

你有多大可能使用这个活动?如果它根本不可能,那么您可能需要考虑第二个,因为它将使您免于使用资源并且不太可能发生线程争用。

答案 1 :(得分:1)

WCF无论如何都不会使用该事件,因为这会破坏任何效率提升。如果您正在进行异步以获得效率和/或可伸缩性,请不要使用等待句柄。抛出NotImplementedException