title: Best/cleanest strategy to update an ObservableCollection from another thread
body: <p>Normally I check if I have access to the <code>ObservableCollection</code> and if not, I call a <code>Dispatcher</code>. Here (on <code>Stackoverflow</code>) are also some other solutions, but I don't know what is the best and cleanest way. I think my solution is obsolete and should not be used anymore.</p>
  
  <p>In my example is the <code>ItemsCollection</code> bound to the <code>UI</code>. The <code>_UpdateTheCollectionFromAnotherThread()</code> would being called (from another <code>thread</code> or would open another <code>thread</code>) and save the data temporary to <code>items</code>. After that I would check the access and call a <code>dispatcher</code> if needed.</p>
  
  <p>Is this the way I have to go or are there some better and cleaner solutions?</p>
  
  <h3>FooClass</h3>
  
  <pre><code>public class FooClass
  {
      // ##############################################################################################################################
      // Properties
      // ##############################################################################################################################
  
      /// &lt;summary&gt;
      /// This Items are bound to my UI.
      /// &lt;/summary&gt;
      public ObservableCollection&lt;string&gt; ItemsCollection { get; } = new ObservableCollection&lt;string&gt;();
  
      // ##############################################################################################################################
      // Singleton pattern
      // ##############################################################################################################################
  
      /// &lt;summary&gt;
      /// The instance of &lt;see cref="FooClass"/&gt;.
      /// &lt;/summary&gt;
      internal static FooClass Instance =&gt; _Instance ?? (_Instance = new FooClass());
      private static FooClass _Instance;
  
      // ##############################################################################################################################
      // Konstruktor
      // ##############################################################################################################################
  
      private FooClass()
      {
  
      }
  
  
      // ##############################################################################################################################
      // Method
      // ##############################################################################################################################
  
      private void _UpdateTheCollectionFromAnotherThread()
      {
          List&lt;string&gt; items = new List&lt;string&gt;();
  
          //Here would be some logic to create and fill the items list....
  
  
          //and now apply them to the public list
  
          if (System.Windows.Application.Current.Dispatcher.CheckAccess())
          {
              ItemsCollection.Clear();
              foreach (string item in items)
              {
                  ItemsCollection.Add(item);
              }
          }
          else
          {
              System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =&gt;
              {
                  ItemsCollection.Clear();
                  foreach (string item in items)
                  {
                      ItemsCollection.Add(item);
                  }
              }));
          }
      }
  }
  </code></pre>