Weird InvokeRequired issue
===

I have a UserControl with a TreeView control called mTreeView on it. I can get data updates from multiple different threads, and these cause the TreeView to be updated. To do this, I've devised the following pattern:
all data update event handlers must acquire a lock and then check for InvokeRequired; if so, do the work by calling Invoke. Here's the relevant code:

      public partial class TreeViewControl : UserControl
      {  
        object mLock = new object();
        void LockAndInvoke(Control c, Action a)
        {
          lock (mLock)
          {
            if (c.InvokeRequired)
            {
              c.Invoke(a);
            }
            else
            {
              a();
            }
          }
        }
        
        public void DataChanged(object sender, NewDataEventArgs e)
        {
          LockAndInvoke(mTreeView, () =>
            {
              // get the data
              mTreeView.BeginUpdate();
              // perform update
              mTreeView.EndUpdate();
            });
        }    
      }

My problem is, sometimes, upon startup, I will get an InvalidOperationException on mTreeView.BeginUpdate(), saying mTreeView is being updated from a thread different than the one it was created. I go back in the call stack to my LockAndInvoke, and lo and behold, c.InvokeRequired is true but the else branch was taken! It's as if InvokeRequired had been set to true on a different thread after the else branch was taken. 

What can I do to prevent this?