title: How to update UI from another thread running in another class
body: <p>I am currently writing my first program on C# and I am extremely new to the language (used to only work with C so far). I have done a lot of research, but all answers were too general and I simply couldn't get it t work.</p>
  
  <p>So here my (very common) problem:
  I have a WPF application which takes inputs from a few textboxes filled by the user and then uses that to do a lot of calculations with them. They should take around 2-3 minutes, so I would like to update a progress bar and a textblock telling me what the current status is.
  Also I need to store the UI inputs from the user and give them to the thread, so I have a third class, which I use to create an object and would like to pass this object to the background thread.
  Obviously I would run the calculations in another thread, so the UI doesn't freeze, but I don't know how to update the UI, since all the calculation methods are part of another class.
  After a lot of reasearch I think the best method to go with would be using dispatchers and TPL and not a backgroundworker, but honestly I am not sure how they work and after around 20 hours of trial and error with other answers, I decided to ask a question myself.</p>
  
  <p>Here a very simple structure of my program:</p>
  
  <pre><code>public partial class MainWindow : Window
  {
      public MainWindow()
      {
          Initialize Component();
      }
  
      private void startCalc(object sender, RoutedEventArgs e)
      {
          inputValues input = new inputValues();
  
          calcClass calculations = new calcClass();
  
          try
          {
               input.pota = Convert.ToDouble(aVar.Text);
               input.potb = Convert.ToDouble(bVar.Text);
               input.potc = Convert.ToDouble(cVar.Text);
               input.potd = Convert.ToDouble(dVar.Text);
               input.potf = Convert.ToDouble(fVar.Text);
               input.potA = Convert.ToDouble(AVar.Text);
               input.potB = Convert.ToDouble(BVar.Text);
               input.initStart = Convert.ToDouble(initStart.Text);
               input.initEnd = Convert.ToDouble(initEnd.Text);
               input.inita = Convert.ToDouble(inita.Text);
               input.initb = Convert.ToDouble(initb.Text);
               input.initc = Convert.ToDouble(initb.Text);
           }
           catch
           {
               MessageBox.Show("Some input values are not of the expected Type.", "Wrong Input", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           Thread calcthread = new Thread(new ParameterizedThreadStart(calculations.testMethod);
           calcthread.Start(input);
      }
  
  public class inputValues
  {
      public double pota, potb, potc, potd, potf, potA, potB;
      public double initStart, initEnd, inita, initb, initc;
  }
  
  public class calcClass
  {
      public void testmethod(inputValues input)
      {
          Thread.CurrentThread.Priority = ThreadPriority.Lowest;
          int i;
          //the input object will be used somehow, but that doesn't matter for my problem
          for (i = 0; i &lt; 1000; i++)
          {
              Thread.Sleep(10);
          }
      }
  }
  </code></pre>
  
  <p>I would be very grateful if someone had a simple explanation how to update the UI from inside the testmethod. Since I am new to C# and object oriented programming, too complicated answers I will very likely not understand, I'll do my best though.</p>
  
  <p>Also if someone has a better idea in general (maybe using backgroundworker or anything else) I am open to see it.</p>