当前位置:编程学习 > C#/ASP.NET >>

轮询系统异常跳出问题

我做了一个多线程的域名轮询系统,主要是进行域名IP解析和网页链接的HTTP报头值的获取,例如400,200等一些常见的返回值。
获取数据没有问题,但是程序运行几个小时回莫名退出,也不报错,不知道该怎么办。因为不知道在哪里跳出的,我加了好多try catch语句,下面是代码。

private void 域名链接测试ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Thread.CurrentThread.IsBackground = true;
                kss = 0;
                jss = 0;
                测试时间.Start();
                域名链接测试计时器.Start();
                是否结束.Start();
                Thread ymcs = new Thread(测试域名导入);//创建域名链接线程数组
                CheckForIllegalCrossThreadCalls = false;
                ymcs.Start();
            }
            catch
            {
                Application.Restart();
            }
        }
这是第一步也就是初始化一下几个变量,然后开启一个线程处理数据

  --------------------编程问答--------------------        void 测试域名导入()
        {
            try
            {
                System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue;
                //域名链接测试ToolStripMenuItem.Enabled = false;
                string strCon = "Data Source=XXX.XXX.XXX.XX;Initial Catalog=域名轮询数据库;Persist Security Info=True;User ID=sa;Pwd=XXXXXX"                SqlConnection myConn1 = new SqlConnection(strCon);
                myConn1.Open();
                SqlCommand cmd = new SqlCommand("select count(*) 域名 from 域名链接状态表 where 最近对比时间 is NULL or (((DATEDIFF(HOUR,最近对比时间,GETDATE())>12) and ((开始对比时间 is NULL) or ((DATEDIFF(HOUR,开始对比时间,GETDATE()))>1))))", myConn1);//最近对比时间 is NULL or DATEDIFF(HOUR,最近对比时间,GETDATE())>12", myConn1);
                int jls = Convert.ToInt32(cmd.ExecuteScalar());
                待测试域名 = jls;
                if (jls > 0)
                {
                    bool 获取到域名 = false;
                    while (获取到域名 == false)
                    {
                        using (SqlTransaction myTran = myConn1.BeginTransaction())
                        {
                            int dqs = 0;
                            SqlCommand NewCom = new SqlCommand("select Top 100 域名 from 域名链接状态表 where 最近对比时间 is NULL or (((DATEDIFF(HOUR,最近对比时间,GETDATE())>12) and ((开始对比时间 is NULL) or ((DATEDIFF(HOUR,开始对比时间,GETDATE()))>1)))) Order By 最近对比时间", myConn1, myTran);
                            SqlDataReader tRead = NewCom.ExecuteReader();
                            try
                            {
                                while (tRead.Read())
                                {
                                    域名数组列表.Add(tRead[0].ToString().Trim());
                                }
                                tRead.Close();
                                for (int i = 0; i < 域名数组列表.Count; i++)
                                {
                                    SqlCommand NewCom1 = new SqlCommand("update 域名链接状态表 set 开始对比时间='" + DateTime.Now + "' where 域名 ='" + 域名数组列表[i].ToString() + "'", myConn1, myTran);
                                    NewCom1.ExecuteNonQuery();
                                    dqs++;
                                    toolStripStatusLabel1.Text = "正在读取待解析域名,已读取" + dqs.ToString() + "条";
                                }
                                myTran.Commit();
                                获取到域名 = true;
                            }
                            catch
                            {
                                myTran.Rollback();
                            }
                        }
                    }
                    myConn1.Close();
                    myConn1.Dispose();
                    int j = 域名数组列表.Count - 1;
                    Thread t = new Thread(ThreadProcymlj);//创建域名链接线程数组
                    CheckForIllegalCrossThreadCalls = false;
                    t.Start(j);
                }
                else
                {
                    域名链接完成度 = "完成";
                }
            }
            catch
            {
                Application.Restart();
            }
        }
这一步主要是获取域名,并且开启下一个线程。 --------------------编程问答--------------------         public void ThreadProcymlj(object data)
        {
            try
            {
                int ymljls;
                ymljls = (int)data;
                string xcsymljls;//线程数+域名链接列数
                System.Threading.Thread[] t = new System.Threading.Thread[域名数组列表.Count];
                ArrayList al = new ArrayList();
                for (int i = 0; i < 域名数组列表.Count; i++)
                {
                    t[i] = new Thread(YmljMethod);
                    CheckForIllegalCrossThreadCalls = false;
                    xcsymljls = i.ToString() + "," + ymljls.ToString();
                    t[i].Start(xcsymljls);
                }
            }
            catch
            {
                Application.Restart();
            }
        }
在该线程中同时开启100个线程来并发处理域名测试。 --------------------编程问答--------------------         void YmljMethod(object data)
        {
            bool 处理成功 = false;
            while (处理成功 == false)
            {
                string xcsymljhs = (string)data;
                int i = int.Parse(xcsymljhs.Substring(0, xcsymljhs.IndexOf(",")));
                int j = int.Parse(xcsymljhs.Substring(xcsymljhs.IndexOf(",") + 1, xcsymljhs.Length - xcsymljhs.IndexOf(",") - 1));
                j = j - 1;
                int wc = 域名数组列表.Count - 1;
                string Url;
                string bj = "";
                string ztz = "";//状态值
                try
                {
                    if (bj == 域名数组列表[i].ToString())
                    {
                        wcs++;
                        当前完成总数 = wcs + 当前完成次数 * 100;
                    }
                    else
                    {
                        Url = 域名数组列表[i].ToString();
                        Url = "http://" + Url;
                        try
                        {
                            Uri Uri = new Uri(Url);
                            HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(Uri);
                            myWebRequest.UserAgent = "Mozilla/4.0(compatible;MSIE 5.00;Windows 98)";
                            myWebRequest.AllowAutoRedirect = false;
                            myWebRequest.Timeout = 50000;
                            HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
                            ztz = ((int)myWebResponse.StatusCode).ToString();
                            myWebRequest.Abort();
                            myWebResponse.Close();
                        }
                        catch (WebException ex)
                        {
                            if (ex.Status == WebExceptionStatus.ProtocolError)
                            {
                                ztz = ((int)(((HttpWebResponse)ex.Response).StatusCode)).ToString();
                            }
                            else
                            {
                                ztz = "网页连接失败";
                            }
                        }

                        string ipaddress = "";
                        try
                        {
                            IPHostEntry ip = Dns.GetHostEntry(域名数组列表[i].ToString());
                            ipaddress = ip.AddressList[0].ToString();
                        }
                        catch
                        {
                            ipaddress = "无法解析域名";
                        }

                        string strCon = "Data Source=xxx.xxx.xx.xx;Initial Catalog=域名轮询数据库;Persist Security Info=True;User ID=sa;Pwd=xxxxxxx;Max Pool Size=100000";
                        SqlConnection myConn1 = new SqlConnection(strCon);
                        myConn1.Open();
                        SqlCommand NewCon = new SqlCommand("select 历史IP from 域名链接状态表 where 域名='" + 域名数组列表[i].ToString() + "'", myConn1);
                        SqlDataReader tRead = NewCon.ExecuteReader();
                        string lishiipaddress = "";//历史IP地址
                        while (tRead.Read())
                        {
                            lishiipaddress = tRead[0].ToString().Trim();
                        }
                        tRead.Close();
                        tRead.Dispose();
                        myConn1.Close();
                        myConn1.Dispose();
                        if (lishiipaddress.Contains(ipaddress) == true)
                        {
                            int qsdz = lishiipaddress.IndexOf(ipaddress);
                            int jsdz = lishiipaddress.IndexOf("次", qsdz);
                            string 获取字符串 = lishiipaddress.Substring(qsdz, jsdz - qsdz + 1);
                            qsdz = 获取字符串.IndexOf(" ") + 1;
                            jsdz = 获取字符串.IndexOf("次", qsdz);
                            string 替换字符串 = 获取字符串.Substring(qsdz, jsdz - qsdz);
                            int chisu = Convert.ToInt32(替换字符串) + 1;
                            替换字符串 = ipaddress + " " + chisu.ToString() + "次";
                            lishiipaddress = lishiipaddress.Replace(获取字符串, 替换字符串);
                        }
                        else
                        {
                            lishiipaddress = lishiipaddress + ipaddress + " 1次" + ",";
                        }
                        域名数组列表[i] = 域名数组列表[i].ToString() + "," + ztz.ToString() + "," + ipaddress.ToString() + "," + lishiipaddress.ToString();
                        wcs++;
                        当前完成总数 = wcs + 当前完成次数 * 域名数组列表.Count;
                        待测试域名--;
                        处理成功 = true;
                        toolStripStatusLabel1.Text = "已轮询域名" + 当前完成总数.ToString() + "个" + ",待测试域名" + 待测试域名.ToString() + ",测试时间" + cssj.ToString() + "毫秒";// ,处理批数" + 当前完成次数.ToString() + "批";

                        if (i == wc)
                        {
                            Thread t = new Thread(域名链接完成度检测);
                            CheckForIllegalCrossThreadCalls = false;
                            t.Start();
                        }
                    }
                }
                catch
                {
                    处理成功 = false;
                }
            }
        }
这段代码就是被开启的100个并发线程的代码了,用来具体的做网页测试。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,