I've done some threading before, but usually standalone methods that were part of a batch file.

I've looked into BackgroundWorker, Thread and using a delegate to pass parameters into a thread, but I think my issue may lie in the fact I am having a hard time seeing how I would want this to flow.

The logic I'm looking for is prettymuch as below

Code:
pb.Initialize(0, this.csv.Count - 1);
pb.Show();

//start at 1 to avoid the headers
for (int x = 1; x < this.csv.Count; x++)
{
  Match match = new Match(this.maxi.GetHost(), this.maxi.GetLogin(), this.cmbDupFields.Text);

  List<string> line = this.csv[x];

  List<Client> duplicatesFound = match.CheckMatch(matchFields, line);

  if (duplicatesFound.Count == 0)
  {
    string recordCreated = this.maxi.CreateRecord(line, fields);
    if (recordCreated != string.Empty)
    {
      this.recordsCreated.Add(recordCreated);
     }//end if
   }
   else
   {
      duplicates.AddRange(duplicatesFound);
    }//end if

     pb.Increment();
}//end for

pb.Close();
There are a few classes in there, but they shouldn't really be worried about. Progress is a windows form that holds my progressbar.

I'm trying to figure out how I want to thread this to allow interaction with the UI while the process is running. My first thought was to just thread

Code:
string recordCreated = this.maxi.CreateRecord(line, fields);
But even when I remove all of the content in the for loop, the UI freezes regardless, so I figured I would need to put all of the code above into a separate method and run that in its own thread. Problem with that is that the method itself calls several objects on the form to get the data it requires.

I've thought of a few different ways, but when I've tried to implement them it hasn't worked out in my favour.

Could someone possibly point me in the right direction with this? I would prefer not having to call any code from the progress window, but if it is required, I can work around it.