在新线程中启动方法

时间:2018-03-07 10:07:13

标签: c# multithreading .net-3.5

我有方法PatchUpdates调用CheckConnection方法来检查与远程pc的连接是否为true然后它将返回第一个方法到用户界面并做一些其他的东西

我搜索并发现我需要使用线程,所以我正在创建新线程 但我的应用程序挂起并停止,没有任何反应

请问我做错了什么?

谢谢

        public void PatchUpdates()
        {
            try
            {
                foreach (DataGridViewRow OfficeListRow in DGV_OfficeList.Rows)
                {
                    string vIPAddress;
                    string vSoruceFilePath;
                    int RowNum;

                    foreach (DataGridViewRow FileListRow in DGV_FileList.Rows)
                    {

                        Thread thrd = new Thread(new System.Threading.ThreadStart(PatchUpdates));
                        thrd.Start();

                        vIPAddress = OfficeListRow.Cells[1].Value.ToString();
                        vSoruceFilePath = FileListRow.Cells[4].Value.ToString();
                        RowNum = OfficeListRow.Index;
                        ///Check the connection to pc
                        if (CheckConnection(vIPAddress) == true)
                        {
                            //MessageBox.Show(vIPAddress + " Pingable ");
                            DGV_OfficeList[2, RowNum].Value = "Online";
                            OfficeListRow.DefaultCellStyle.BackColor = Color.LightGreen;
                        }
                        else
                        {
                            //MessageBox.Show(vIPAddress + " Not Pingable ");
                            DGV_OfficeList[2, RowNum].Value = "Offline";
                            OfficeListRow.DefaultCellStyle.BackColor = Color.LightCyan;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



    public static bool CheckConnection(string IPAddress)
    {
        bool vPingable = false;

        try
        {
            Ping png = new Ping();
            PingReply PngReply = png.Send(IPAddress);
            vPingable = PngReply.Status == IPStatus.Success;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }
        return vPingable;
    }

1 个答案:

答案 0 :(得分:1)

您正在PatchUpdates方法中将PatchUpdates()传递给ThreadStart委托。

Thread thrd = new Thread(new System.Threading.ThreadStart(PatchUpdates));
thrd.Start();

这意味着PatchUpdates()方法在新的第二个线程上重新开始,它将在新的第三个线程上重新开始,它将在新的第四个线程上重新开始,上...

基本上你是在开始无限的新线程(只要DGV_FileList.Rows中有项目),这将最终消耗你所有的资源。