I have made an application that opens a file reads the content then splits the content into categories depending on their properties. Some of the files are over 1mb in size and with my code they can take some time so I tried adding a progress bar to show progress over time so the user knows its working and not frozen.

Since I am still learning and wanted hands on learning I made two instances of the application. One that uses DLLs and one that has all the information contained within the exe itself. The one w/o DLLs I got to work flawlessly with a progress bar. The issue I am having is the one that calls up the DLL. Since I was unable to think of any ideas to make this work with a progress bar I decided to make it a marquee bar. I need a way to make a pause for the marquee to be able to initiate and for the application to not look frozen as it does now.

Here is the code for the one I am trying to get to work
Code:
private void btnExtract_Click(object sender, EventArgs e)
        {
            // Disable button so its not pressed on accident again
            btnExtract.Enabled = false;

            // Clear text box and Display message of extracting items
            lstDisplay.Items.Clear();
            lstDisplay.Items.Add("Extracting items now...");

            // Set speed of marquee to show the program is working
            progBar.MarqueeAnimationSpeed = 100;

            // Create extraction class
            string filePath = txtDir.Text;
            Extracion path = new Extracion();
            path.Extract(filePath);

            // Display operation completed message
            lstDisplay.Items.Add("");
            lstDisplay.Items.Add("Extraction Complete");

            // Remove extension from path
            string dirPath = Path.GetFileNameWithoutExtension(txtDir.Text);

            // Get list of directories and add to combo box categories
            DirectoryInfo catDir = new DirectoryInfo(dirPath);

            DirectoryInfo[] catFiles = catDir.GetDirectories();
            foreach (DirectoryInfo catName in catFiles)
            {
                cmbCat.Items.Add(catName.Name);
            }

            cmbCat.Enabled = true;

            // Set speed of marquee to 0 to show program has finished
            progBar.MarqueeAnimationSpeed = 0;
My code may not be the best to do this but I'm sure there is a way to get it to work I just haven't found out how. I have read about using Thread.Sleep(x) but that seems to freeze the whole application and after it comes back it does the same thing as without it. It keeps on going through the file and no update on the marquee or the list box is done until after it's done splitting up the file.

I have also tried making a timer but from what I noticed the timer got executed twice the way I made it. Maybe if I had two timers the first one executing my functions and the second one doing nothing but disabling both timers that would be a solution but I haven't tried that yet. I am hoping someone here can help me out with this. It's not an essential function for my program but would like something to show users that its working. I could always use the one without the DLL but the DLL one just looks tidier.

Thanks in advance to anyone looking at my post.