Search code examples
c#.netwinformsbackgroundworker

C# Background Worker DoWork getting stuck


Hey I have this test back ground worker which seems to get stuck on the DoWork method or maybe the RunWorkerCompleted is not being fired can you guys see anything wrong here?

Maybe I am not implementing this properly :/

 using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;

        using System.Threading.Tasks;
        using System.Windows.Forms;
        using MailChimp;
        using System.Threading;
        using System.Runtime.InteropServices;

        namespace Chimporter
        {
            public partial class Form1 : Form
            {
                //Worker thread flag set to false
                static bool done = false;
                //Console dll
                [DllImport("Kernel32.dll")]
                static extern Boolean AllocConsole();

                public Form1()
                {
                    InitializeComponent();
                }

                private void button1_Click(object sender, EventArgs e)
                {

                }

                private void label1_Click(object sender, EventArgs e)
                {

                }



                private void accountInformationToolStripMenuItem_Click(object sender, EventArgs e)
                {
                    //loadWindow pleaseWait = new loadWindow();
                    //pleaseWait.Show();
                    BackgroundWorker bg = new BackgroundWorker();
                    bg.DoWork += new DoWorkEventHandler(bg_DoWork);
                    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
                    bg.RunWorkerAsync();
                    while (!done)
                    {
                        //Console.WriteLine("Waiting in Main, tid " + Thread.CurrentThread.ManagedThreadId);
                        //Thread.Sleep(100);

                    }
                    //AccountInfo accInfo = new AccountInfo();
                    //accInfo.Show();

                }

                public void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                {
                    if (!AllocConsole())
                    {
                        Console.WriteLine("Fnished! " + Thread.CurrentThread.ManagedThreadId);
                    }
                    done = true;
                }

                public void bg_DoWork(object sender, DoWorkEventArgs e)
                {
                    for (int i = 0; i <= 3; i++)
                    {
                        if (!AllocConsole())
                        {
                            Console.WriteLine("Work Line: " + i + ", tid " + Thread.CurrentThread.ManagedThreadId);
                            Thread.Sleep(500);
                        }                
                    }            
                    //string key = "e42713458882f6c2c27b3d6d951174a2-us6";
                    //var mc = new MCApi(key, true);
                    //string user = mc.GetAccountDetails().Username.ToString();
                    return;
                }

                private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
                {

                }

                private void exitToolStripMenuItem_Click(object sender, EventArgs e)
                {
                    //Exit application Form.Close()
                    Application.Exit();
                }
            }
        }

Solution

  • Take your while (!done) out. It is locking up the main thread. The worker completed event gets raised on that thread, but since it is busy in a loop it will never get raised.

    The whole point of the RunWorkerCompleted event is so that you get a notification on the main thread and you don't have to lock it up in a busy loop and make your gui unresponsive.