title: UIAutomation Memory Issue
body: <p>I have a simple WPF program that just has a single button with no event handling logic.  I then use the UIAutomation framework to click that button many times in a row.  Finally, I look at the memory used by the WPF program and it seems to grow and grow.</p>
  
  <p>Anyone know why this is the case and how I can prevent this from happening?</p>
  
  <p>Here is the simple WPF program (nothing in the code behind):</p>
  
  <pre><code>&lt;Window x:Class="SimpleApplication.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Simple Application"
          AutomationProperties.AutomationId="Simple Application"
          Height="350" Width="525"&gt;
      &lt;Grid&gt;
          &lt;Button AutomationProperties.AutomationId="button" Height="50" Width="100"&gt;Click Me&lt;/Button&gt;
      &lt;/Grid&gt;
  &lt;/Window&gt;
  </code></pre>
  
  <p>Here is the UIAutomation test program:</p>
  
  <pre><code>class Program
  {
      static void Main(string[] args)
      {
          string appPath = @"..\..\..\SimpleApplication\bin\Debug\SimpleApplication.exe";
          string winAutoId = "Simple Application";
          string buttonAutoId = "button";
  
          using (Process process = Process.Start(new ProcessStartInfo(appPath)))
          {
              Thread.Sleep(TimeSpan.FromSeconds(1));
  
              AutomationElement winElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, winAutoId));
  
              for (int i = 0; i &lt; 1001; i++)
              {
                  AutomationElement buttonElement = winElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, buttonAutoId));
  
                  InvokePattern invokePattern = (InvokePattern)buttonElement.GetCurrentPattern(InvokePattern.Pattern);
                  invokePattern.Invoke();
  
                  process.Refresh();
                  long totalMemory = process.WorkingSet64 + process.PagedMemorySize64;
  
                  if (i % 100 == 0)
                  {
                      Console.WriteLine("Memory = {0} MB", ((double)totalMemory) / (1024 * 1024));
                  }
              }
  
              WindowPattern windowPattern = (WindowPattern)winElement.GetCurrentPattern(WindowPattern.Pattern);
              windowPattern.Close();
          }
  
          Console.WriteLine();
          Console.WriteLine("Press Enter to Continue...");
          Console.ReadLine();
      }
  }
  </code></pre>
  
  <p>Here are the results from the program on my machine:</p>
  
  <pre><code>Memory = 38.20703125 MB
  Memory = 42.9296875 MB
  Memory = 45.00390625 MB
  Memory = 47.04296875 MB
  Memory = 51.9296875 MB
  Memory = 52.2890625 MB
  Memory = 52.41015625 MB
  Memory = 55.70703125 MB
  Memory = 55.70703125 MB
  Memory = 57.21484375 MB
  Memory = 59.09375 MB
  </code></pre>
  
  <p>Looking at it with the .NET Memory Profiler, the new objects that are appearing in the WPF application are from the System.Threading namespace.  When I run the WPF program by itself and click the button with the mouse these objects do no appear.</p>
  
  <p>UPDATE:</p>
  
  <p>I tried doing a similar test using Visual Studio's CodedUI, and the same 8 objects appeared to leak in that situation as well.  The objects that appear to leak are:</p>
  
  <pre><code>System.Threading.CancellationTokenSource
  System.Threading.TimerQueueTimer
  System.Threading.SparselyPopulatedArray&lt;CancellationCallbackInfo&gt;[]
  System.Threading.Timer
  System.Threading.TimerHolder
  System.Threading.SparselyPopulatedArray&lt;CancellationCallbackInfo&gt;
  System.Threading.SparselyPopulatedArrayFragment&lt;CancellationCallbackInfo&gt;
  System.Threading.CancellationCallbackInfo[]
  </code></pre>
  
  <p>I have also submitted a bug to Microsoft:</p>
  
  <p><a href="http://connect.microsoft.com/VisualStudio/feedback/details/801209/uiautomation-memory-issue">http://connect.microsoft.com/VisualStudio/feedback/details/801209/uiautomation-memory-issue</a></p>