jiji
jiji

Reputation: 9

Multithread using backgroundworker and event handler

I'm developing a sample program to connect multiple device using backgroundworker. Each device connected will be add to the list as new object. After finished connecting all the devices, i wanted to add an event handler for each connected devices. The problem that i'm facing now is the event handler doesn't firing at all. Below are the sample codes.

The Connect click button event :

private void btnConnect_Click(object sender, EventArgs e)
{
    using (BackgroundWorker m_oWorker = new BackgroundWorker())
    {
        m_oWorker.DoWork += delegate (object s, DoWorkEventArgs args)
        {
            int iIpStart = 0;
            int iIpEnd = 0;
            string strIp1 = string.Empty;
            string strIp2 = string.Empty;

            list.Clear();

            string[] sIP1 = txtIpStart.Text.Trim().ToString().Split('.');
            string[] sIP2 = txtIpEnd.Text.Trim().ToString().Split('.');

            iIpStart = Convert.ToInt32(sIP1[3]);
            iIpEnd = Convert.ToInt32(sIP2[3]);

            strIp1 = sIP1[0] + "." + sIP1[1] + "." + sIP1[2] + ".";
            strIp2 = sIP2[0] + "." + sIP2[1] + "." + sIP2[2] + ".";

            Ping ping = new Ping();
            PingReply reply = null;

            int iIncre = 0;
            int iVal = (100 / (iIpEnd - iIpStart));
            for (int i = iIpStart; i <= iIpEnd; i++)
            {
                Thread.Sleep(100);

                string strIpconnect = strIp1 + i.ToString();
                Console.Write("ip address : " + strIpconnect + ", status: ");
                reply = ping.Send(strIpconnect);

                if (reply.Status.ToString() == "Success")
                {
                    if (ConnectDevice(strIpconnect))
                    {
                        strLastDevice = strIpconnect + " Connected";
                        isconnected = true;
                    }
                    else
                    {
                        isconnected = false;
                    }
                }
                else
                {
                    isconnected = false;
                }
                m_oWorker.ReportProgress(iIncre);
                iIncre = iIncre + iVal;
            }
            m_oWorker.ReportProgress(100);
        };
        m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
        m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
        m_oWorker.WorkerReportsProgress = true;
        m_oWorker.WorkerSupportsCancellation = true;

        m_oWorker.RunWorkerAsync();
    }
}

ConnectDevice function method. Connected device will be added to the list :

protected bool ConnectDevice(string sIP)
{
    try
    {
        NewSDK sdk = new NewSDK();

        if (sdk.Connect() == true)
        {
            list.Add(new objSDK { sdk = sdk, ipaddress = sIP });
            return true;
        }
        else
        {

        }
    }
    catch() {}
    return false;
}

the Backgroundworker :

void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //If it was cancelled midway
    if (e.Cancelled)
    {
        lblStatus.Text = "Task Cancelled.";
    }
    else if (e.Error != null)
    {
        lblStatus.Text = "Error while performing background operation.";
    }
    else
    {
        lblStatus.Text = "Task Completed...";
        btnListen.Enabled = true;
    }
}

void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //Here you play with the main UI thread
    progressBar1.Value = e.ProgressPercentage;
    lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";

    if (isconnected)
    {
        listBox2.Items.Add(strLastDevice);
        string[] ssplit = sDeviceInfo.Split(';');

        foreach (string sword in ssplit)
        {
            listBox1.Items.Add(sword);
        }
    }
}

The function to attached event :

private void RegisterEvent()
{
    foreach (objSDK obj in list)
    {
        obj.sdk.OnTransaction += () =>
        {
            listBox1.Items.Add("ip : " + obj.IP + " transaction");
        };
    }
}

Upvotes: 0

Views: 256

Answers (2)

jiji
jiji

Reputation: 9

I try another workaround by using thread and task and work perfectly. Thanks for all response

Upvotes: 0

John Wu
John Wu

Reputation: 52230

You have declared m_oWorker as a local variable. I'm guessing this was a mistake ( the m_ prefix should only be used for class member variables)?

Also, you declared it within a using statement, meaning that it that the framework will call Dispose() on it at the end of the using block. Even if you held on to a reference to it (and I don't think you do) it still means its resources will be deallocated, which is probably why it isn't handling any events.

Upvotes: 1

Related Questions