Search code examples
c#backgroundworkertcpclient

Array of Background Worker to Read Tcpclient continuously


We have developed Window service in C# to read data using TcpClient with the help of background worker. Here, we are reading data from multiple IP's so using array of background worker to achieve this. Our service works perfectly fine but after few hours one of thread stops running. For Here i am pasting functions which is related to this problem. Calling sequence 1. StartMonitoring 2. Dowork

Assuming two rows are coming from database so two background worker objects are creating which will call backgroundWorkerFiles_DoWork function. In backgroundWorkerFiles_DoWork function the int i = (int)e.Argument; first comes 0 then 1 and according to 0 and 1 they connect there IP with its port. But after some time i always comes 1 not 0. Intially both runs but one thread stop running and always gives 1 to connect the IP not 0. Kindly help us out from this problem. i am also trying. I can paste complete code also if you want.

public static string SERVICE_TIMER =Convert.ToString(ConfigurationSettings.AppSettings["SERVICE_TIMER"]);
    public static int READING_TIMER = Convert.ToInt32(ConfigurationSettings.AppSettings["READING_TIMER"]);
    public static string PLANT = Convert.ToString(ConfigurationSettings.AppSettings["PLANT"]);
    public static string FAMILY = Convert.ToString(ConfigurationSettings.AppSettings["FAMILY"]);
    public static BackgroundWorker[] BackgroundWorker_Controllers = new BackgroundWorker[maxThreads];
    public static TcpClient[] tcpClientRead = new TcpClient[maxThreads];
    public static TcpClient[] tcpClientWrite = new TcpClient[maxThreads];
    public CONTROLLERS[] listObj = new CONTROLLERS[maxThreads];
    public Thread _thread;


private void startMonitoring()    
    {    
        //while (true)
        //{`enter code here`
        try
        {
        CHECK:
            WriteLog("startsMonitoring");
            Thread.Sleep(1000 * 20);
            if (ReadSetting())
            {
                Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Control Panel\\International", "sShortDate", "dd-MMM-yyyy");
                CreateTables();
                query = "select * from XXES_CONTROLLERS where active='Y'";
                DataTable dt = returnDataTable(query);
                if (dt.Rows.Count > 0)
                {
                    maxThreads = dt.Rows.Count;
                    if (maxThreads > 0)
                    {
                        BackgroundWorker_Controllers = new BackgroundWorker[maxThreads];
                        tcpClientRead = new TcpClient[maxThreads];
                        tcpClientWrite = new TcpClient[maxThreads];
                        listObj = new CONTROLLERS[maxThreads];
                        int Counter = 0;
                        foreach (DataRow dr in dt.Rows)
                        {
                            listObj[Counter] = new CONTROLLERS();
                            listObj[Counter].DID = Convert.ToString(dr["DID"]).Trim();
                            listObj[Counter].IP_ADDR = Convert.ToString(dr["IP_ADDR"]).Trim();
                            listObj[Counter].PORT = Convert.ToString(dr["PORT"]).Trim();
                            listObj[Counter].STAGE = Convert.ToString(dr["STAGE"]).Trim();
                            listObj[Counter].INPUT_MODE = Convert.ToString(dr["INPUT_MODE"]).Trim();
                            listObj[Counter].READING_TYPE = Convert.ToString(dr["READING_TYPE"]).Trim();
                            Counter++;
                        }
                        for (int f = 0; f < maxThreads; f++)
                        {
                            BackgroundWorker_Controllers[f] = new BackgroundWorker();
                            BackgroundWorker_Controllers[f].DoWork += new DoWorkEventHandler(backgroundWorkerFiles_DoWork);
                            BackgroundWorker_Controllers[f].RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorkerFiles_RunWorkerCompleted);
                            //BackgroundWorker_Controllers[f].ProgressChanged +=
                            //    new ProgressChangedEventHandler(backgroundWorkerFiles_ProgressChanged);
                            //BackgroundWorker_Controllers[f].WorkerReportsProgress = true;
                            BackgroundWorker_Controllers[f].WorkerSupportsCancellation = false;
                        }

                        for (int threadNum = 0; threadNum < maxThreads; threadNum++)
                        {
                            if (!BackgroundWorker_Controllers[threadNum].IsBusy)
                            {
                                BackgroundWorker_Controllers[threadNum].RunWorkerAsync(threadNum);
                            }
                        }
                    }

                }

            }
            else
            {
                goto CHECK;
            }
        }
        catch (Exception ex)
        {
            ErrorLog("Module:startMonitoring: " + ex.Message.ToString());
        }
        finally { }
        // }
    }

private void backgroundWorkerFiles_DoWork(object sender, DoWorkEventArgs e)
    {

        string ip = ""; bool toggle = false; DateTime todaysdate = new DateTime();

        try
        {
            BackgroundWorker sendingWorker = (BackgroundWorker)sender;//Capture the BackgroundWorker that fired the event
             int i = (int)e.Argument;
            #region Main
            while (!sendingWorker.CancellationPending)
            {
                #region MainTry
                try
                {
                    try
                    {
                        StreamWriter sw = new StreamWriter(AppPath + "\\Live.txt");
                        sw.WriteLine(DateTime.Now);
                        sw.Close();
                    }
                    catch { }
                    finally { }
                    #region WhileLOOP
                    todaysdate = GetServerDateTime();
                    if (listObj[i].toggle == false)
                    {
                        try
                        { if (tcpClientRead[i].Connected) tcpClientRead[i].Close(); }
                        catch { }
                        finally { }
                        tcpClientRead[i] = new System.Net.Sockets.TcpClient();
                        tcpClientRead[i].Connect(listObj[i].IP_ADDR, Convert.ToInt32(listObj[i].PORT));
                    }
                    //if (tcpClientRead[i].Connected)
                    if (isPinging(listObj[i].IP_ADDR) && tcpClientRead[i].Connected)
                    {
                        query = "delete from XXES_LIVE_DATA where stage='" + listObj[i].STAGE.Trim() + "' and data_type='ERROR'";
                        EXEC_QUERY(query);
                        listObj[i].toggle = true;
                        //NetworkStream myNetworkStream = tcpClientRead[i].GetStream();
                        listObj[i].myNetworkStream = tcpClientRead[i].GetStream();
                        if (listObj[i].myNetworkStream.CanRead)
                        {
                            byte[] myReadBuffer = new byte[1024];
                            //  StringBuilder myCompleteMessage = new StringBuilder();
                            listObj[i].myCompleteMessage = new StringBuilder();
                            int numberOfBytesRead = 0;
                            //  Incoming message may be larger than the buffer size. 
                            while (listObj[i].myNetworkStream.DataAvailable)
                            {
                                listObj[i].myNetworkStream.Flush();
                                numberOfBytesRead = listObj[i].myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                                listObj[i].myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                                Thread.Sleep(READING_TIMER);
                            }
                            if (!string.IsNullOrEmpty(Convert.ToString(listObj[i].myCompleteMessage)))
                            {
                                query = "delete from XXES_LIVE_DATA where stage='" + listObj[i].STAGE.Trim() + "' and data_type='MSG'";
                                EXEC_QUERY(query);
                                //query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,SRLNO,STAGE,SCAN_DATE,DATA_TYPE) values('" + PLANT + "','" + FAMILY + "','" + Convert.ToString(listObj[i].myCompleteMessage) + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG')";
                                //EXEC_QUERY(query);
                                if (listObj[i].STAGE == "BP")
                                {
                                    WriteLog("Before Paint : " + Convert.ToString(listObj[i].myCompleteMessage));
                                    if (string.IsNullOrEmpty(BP_JOB) && Convert.ToString(listObj[i].myCompleteMessage).Length == 4)
                                        BP_HOOK = Convert.ToString(listObj[i].myCompleteMessage).Trim();
                                    if (string.IsNullOrEmpty(BP_JOB) && Convert.ToString(listObj[i].myCompleteMessage).Length != 4)
                                        BP_JOB = Convert.ToString(listObj[i].myCompleteMessage).Trim();

                                }
                                if (listObj[i].STAGE == "AP")
                                {
                                    WriteLog("After Paint : " + Convert.ToString(listObj[i].myCompleteMessage).Trim());
                                    if (string.IsNullOrEmpty(AP_HOOK) && Convert.ToString(listObj[i].myCompleteMessage).Trim().Length == 4)
                                        AP_HOOK = Convert.ToString(listObj[i].myCompleteMessage).Trim();
                                    if (string.IsNullOrEmpty(AP_JOB) && Convert.ToString(listObj[i].myCompleteMessage).Trim().Length != 4)
                                        AP_JOB = Convert.ToString(listObj[i].myCompleteMessage).Trim();
                                }
                                if (Convert.ToString(listObj[i].myCompleteMessage).Trim().Length == 4)
                                    listObj[i].HOOK = Convert.ToString(listObj[i].myCompleteMessage).Trim();
                                else if (Convert.ToString(listObj[i].myCompleteMessage).Trim().Length > 4)
                                    listObj[i].JOB = Convert.ToString(listObj[i].myCompleteMessage).Trim();
                                if (!string.IsNullOrEmpty(listObj[i].HOOK) && !string.IsNullOrEmpty(listObj[i].JOB) && listObj[i].STAGE.Trim() == "BP")
                                {
                                    bool isCheck = false;
                                    Data = "";
                                    Data = get_Col_Value("select fcode_id || '#' || ITEM_CODE || '#' || final_label_date from XXES_JOB_STATUS where jobid='" + listObj[i].JOB.Trim() + "'"); // and final_label_date is null");
                                    if (Data.Contains('#'))
                                    {
                                        listObj[i].fcode_id = Convert.ToString(Data.Split('#')[0]).Trim();
                                        listObj[i].ITEM_CODE = Convert.ToString(Data.Split('#')[1]).Trim();
                                        listObj[i].FINAL_DATE = Convert.ToString(Data.Split('#')[2]).Trim();
                                    }
                                    else
                                    {
                                      listObj[i].FINAL_DATE=listObj[i].fcode_id = listObj[i].ITEM_CODE = "";
                                    }
                                    if (string.IsNullOrEmpty(listObj[i].fcode_id))
                                    {
                                        query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "JOB :" + listObj[i].JOB + " is not buckleup','" + listObj[i].JOB + "')";
                                        EXEC_QUERY(query);
                                        WriteLog("JOB :" + listObj[i].JOB + " is not buckleup");
                                    }
                                    else
                                    {
                                        if (!string.IsNullOrEmpty(listObj[i].FINAL_DATE))
                                        {
                                            query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "Final sticker already taken for JOB :" + listObj[i].JOB + "','" + listObj[i].JOB + "')";
                                            EXEC_QUERY(query);
                                            isCheck = true;
                                            WriteLog("Final sticker already taken for JOB :" + listObj[i].JOB + "");
                                        }
                                        else if (!string.IsNullOrEmpty(listObj[i].HOOK))
                                        {
                                            query = "select * from (select JOBID from XXES_CONTROLLERS_DATA where hook_no='" + listObj[i].HOOK.Trim() + "' order by ENTRY_DATE DESC) where rownum=1";
                                            string jobid = get_Col_Value(query).Trim();
                                            if (!string.IsNullOrEmpty(jobid))
                                            {
                                                if (CheckExits("select count(*) from XXES_JOB_STATUS where jobid='" + jobid + "' and plant_code='" + PLANT.Trim() + "' and family_code='" + FAMILY.Trim() + "' and final_label_date is null"))
                                                {
                                                    query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "JOB " + jobid + " already in paint shop on  HOOK " + listObj[i].HOOK + "','" + listObj[i].JOB + "')";
                                                    if (EXEC_QUERY(query))
                                                    {
                                                        isCheck = true;
                                                        WriteLog("JOB " + jobid + " already working on HOOK " + listObj[i].HOOK + "");
                                                    }
                                                }
                                            }
                                        }
                                        if (isCheck == false)
                                        {
                                            query = "select count(*) from XXES_CONTROLLERS_DATA  where JOBID='" + listObj[i].JOB.Trim() + "' and stage='" + listObj[i].STAGE.Trim() + "' and plant_code='" + PLANT.Trim().ToUpper() + "' and FAMILY_CODE='" + FAMILY.Trim() + "'";// and flag is null";
                                            if (CheckExits(query))
                                            {
                                                query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "JOB: " + listObj[i].JOB + " Already HOOKED UP','" + listObj[i].JOB + "')";
                                                if (EXEC_QUERY(query))
                                                {
                                                    WriteLog("JOB: " + listObj[i].JOB + " Already HOOKED UP");
                                                }
                                            }
                                            else
                                            {
                                                query = @"insert into XXES_CONTROLLERS_DATA(PLANT_CODE,FAMILY_CODE,JOBID,HOOK_NO,STAGE,ENTRY_DATE,FCODE_ID,ITEM_CODE)
                                                            values('" + PLANT.Trim().ToUpper() + "','" + FAMILY.Trim().ToUpper() + "','" + listObj[i].JOB.Trim() + "','" + listObj[i].HOOK.Trim() + "','" + listObj[i].STAGE + "',SYSDATE,'" + listObj[i].fcode_id.Trim() + "','" + listObj[i].ITEM_CODE.Trim() + "')";
                                                if (EXEC_QUERY(query))
                                                {
                                                    WriteLog("Inserted= " + query);
                                                    query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "LAST JOB: " + listObj[i].JOB + " HOOKED UP','" + listObj[i].JOB + "')";
                                                    if (EXEC_QUERY(query))
                                                    {
                                                        WriteLog("LAST JOB: " + listObj[i].JOB + " HOOKED UP");
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    listObj[i].FINAL_DATE=listObj[i].ITEM_CODE= listObj[i].fcode_id=listObj[i].JOB = listObj[i].HOOK = "";
                                }
                                else if (!string.IsNullOrEmpty(listObj[i].HOOK) && listObj[i].STAGE.Trim() == "AP")
                                {
                                    string data = "";
                                    data = get_Col_Value("select jobid || '#' || fcode_id || '#' || ITEM_CODE from XXES_CONTROLLERS_DATA where HOOK_NO='" + listObj[i].HOOK.Trim() + "' and stage='BP' and plant_code='" + PLANT.Trim().ToUpper() + "' and FAMILY_CODE='" + FAMILY.Trim() + "' and flag is null");
                                    if (!string.IsNullOrEmpty(data) && data.Trim().Contains('#'))
                                    {
                                        listObj[i].JOB = data.Split('#')[0].Trim();
                                        listObj[i].fcode_id = data.Split('#')[1].Trim();
                                        listObj[i].ITEM_CODE = data.Split('#')[2].Trim();
                                        query = @"insert into XXES_CONTROLLERS_DATA(PLANT_CODE,FAMILY_CODE,JOBID,HOOK_NO,STAGE,ENTRY_DATE,FCODE_ID,ITEM_CODE)
                                                            values('" + PLANT.Trim().ToUpper() + "','" + FAMILY.Trim().ToUpper() + "','" + listObj[i].JOB.Trim() + "','" + listObj[i].HOOK.Trim() + "','" + listObj[i].STAGE + "',SYSDATE,'" + listObj[i].fcode_id.Trim() + "','" + listObj[i].ITEM_CODE.Trim() + "')";
                                        if (EXEC_QUERY(query))
                                        {
                                            query = "update XXES_CONTROLLERS_DATA set flag='Y' where HOOK_NO='" + listObj[i].HOOK.Trim() + "' and flag is null";
                                            if (EXEC_QUERY(query))
                                            {
                                                WriteLog("Hook :" + listObj[i].HOOK + " Out from After Paint");
                                                query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','" + "LAST JOB: " + listObj[i].JOB + " HOOK DOWN','" + listObj[i].JOB + "')";
                                                if (EXEC_QUERY(query))
                                                {
                                                    WriteLog("LAST JOB: " + listObj[i].JOB + " HOOKED DOWN");
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','HookNo " + listObj[i].HOOK + " not found at before paint stage or already scanned','" + listObj[i].HOOK + "')";
                                        EXEC_QUERY(query);
                                        WriteLog("HookNo " + listObj[i].HOOK + " not found at before paint stage or already scanned");
                                    }
                                    listObj[i].JOB = listObj[i].HOOK = "";
                                }
                                else if (!string.IsNullOrEmpty(listObj[i].JOB) && listObj[i].STAGE.Trim() == "AP")
                                {
                                    query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1,srlno) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'MSG','Please scan valid Hook','" + listObj[i].JOB + "')";
                                    EXEC_QUERY(query);
                                    WriteLog("Please scan valid Hook");
                                    listObj[i].JOB = listObj[i].HOOK = "";
                                }
                            }

                        }
                    }
                    else
                    {
                        listObj[i].toggle = false;
                        throw new SocketException(10060);
                    }
                    Thread.Sleep(Convert.ToInt32(SERVICE_TIMER) * 1000);
                    #endregion WhileLOOP
                }
                catch (SocketException ex)
                {
                    #region ERROR
                    string error = "";
                    if (ex.ErrorCode.Equals(10060))
                    {
                        error = listObj[i].IP_ADDR + " not connected. Please check the network";
                    }
                    else
                    {
                        if (ex.Message.Length > 500)
                            error = ex.Message.Substring(0, 498);
                        else
                            error = ex.Message.ToString();
                    }
                    listObj[i].toggle = false;
                    query = "delete from XXES_LIVE_DATA where stage='" + listObj[i].STAGE.Trim() + "' and DATA_TYPE='ERROR'";
                    EXEC_QUERY(query);
                    query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'ERROR','" + error.Trim() + "')";
                    EXEC_QUERY(query);
                    ErrorLog("Module:While Connecting Controller: " + ex.Message.ToString());
                    if (tcpClientRead[i].Connected)
                        tcpClientRead[i].Close();
                    #endregion ERROR
                }
                catch (Exception ex)
                {
                    #region ERROR
                    string error = "";
                    if (ex.Message.Length > 500)
                        error = ex.Message.Substring(0, 498);
                    else
                        error = ex.Message.ToString();
                    error = listObj[i].STAGE + "=>" + error;
                    listObj[i].toggle = false;
                    query = "delete from XXES_LIVE_DATA where stage='" + listObj[i].STAGE.Trim() + "' and DATA_TYPE='ERROR'";
                    EXEC_QUERY(query);
                    query = @"insert into XXES_LIVE_DATA(PLANT_CODE,FAMILY_CODE,STAGE,SCAN_DATE,DATA_TYPE,REMARKS1) values('" + PLANT.Trim() + "','" + FAMILY + "','" + listObj[i].STAGE.Trim() + "',SYSDATE,'ERROR','" + error.Trim() + "')";
                    EXEC_QUERY(query);
                    ErrorLog("Module:While Connecting Controller: " + ex.Message.ToString());
                    #endregion ERROR
                }
                finally
                {
                    // toggle = false;
                    //tcpClientRead[i].Close();
                }
                #endregion MainTry

                //}

                Thread.Sleep(Convert.ToInt32(SERVICE_TIMER) * 1000);
            }

            #endregion MAIN
        }
        catch (Exception ex)
        {
            ErrorLog("Module:DoWork: " + ex.Message.ToString());
        }
        finally { }
    }
    public static bool isPinging(string ip)
    {
        bool isPing = false;
        try
        {
            Ping myPing = new Ping();
            PingReply reply = myPing.Send(ip, 1000);
            if (reply != null)
            {
                if (reply.Status.ToString().ToUpper() == "SUCCESS")
                    isPing = true;
                else
                    isPing = false;
            }
            return isPing;
        }
        catch { return isPing; }
        finally { }
    }


    //}
    //private void backgroundWorkerFiles_ProgressChanged(object sender, ProgressChangedEventArgs e)
    //{
    //    // Use this method to report progress to GUI
    //}

    private void backgroundWorkerFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            WriteLog("Worker Completed");
            for (int i = 0; i < maxThreads; i++)//Start a for loop
            {
                if (tcpClientRead[i].Connected)
                    tcpClientRead[i].Close();
            }
        }
        catch { }
        finally { }
    }

Solution

  • I have converted the background worker into TASK library. Now problem is solved thanks. Changed the following things:-

    public static Task[] BackgroundWorker_Controllers = new Task[maxThreads]; //declration

    //calling

    for (int f = 0; f < maxThreads; f++)
    {
    var ii = f;
    BackgroundWorker_Controllers[f] = new Task(() =>
    { 
    ConnectControllers(ii, dt.Rows.Count); }, TaskCreationOptions.None);
                                BackgroundWorker_Controllers[f].Start();
    }