轮询系统异常跳出问题
我做了一个多线程的域名轮询系统,主要是进行域名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#