跪求…………………………跪求指导…………我要暴走了……

hack大灯 2012-05-29 06:10:06
首先,我通过按钮启动多个线程,循环启动,但是每次都是只能运行完成2个线程


private void button1_Click_1(object sender, EventArgs e)
{
this.timer1.Enabled = true;
this.Paraments = this.textBox1.Text;
this.Cookies = this.textBox2.Text;
if (this.dt.Rows.Count == 0)
{
for (int i = begin; i <= end; i++)
{

DataRow dr = dt.NewRow();
dr["URL"] = this.text_url.Text.Replace("(*)", i.ToString());
dr["id"] = i.ToString();
this.dt.Rows.Add(dr);
}
this.dataGridView1.Refresh();
}
StopThread(Go_threads);

for (int i = 0; i < this.dt.Rows.Count; i++)
{
Go_threads[i] = new Thread(new ParameterizedThreadStart(Go_Thread));
//Go_threads[i].Name = "thread_" + i.ToString();
Go_threads[i].Start(i);
}

}
private void Go_Thread(object index)
{
int i = int.Parse(index.ToString());
string Url = dt.Rows[i]["URL"].ToString();
string parament = Paraments;
parament = parament.Replace("(*)", dt.Rows[i]["id"].ToString());
string cookies = Cookies;
HttpManager hm = new HttpManager(Url,parament,cookies);
string res = "";

res = hm.Post();
string html = hm.Data;
if (html != string.Empty)
{
if (html.Contains("文章不存在"))
{
res = "HasNotpage";
}
}
dt.Rows[i]["FLAG"] = res;


}


我加入了一个timer,然后设置5秒检测一次线程数组,如果数组没有running线程的话,就新开下一组线程,但是我发现在这个时候,Thread.start()失效了!!!!求解啊啊啊啊啊啊啊!!!!


private void timer1_Tick(object sender, EventArgs e)
{
bool isOver = true;
for (int i = 0; i < Test_threads.Length; i++)
{
if (Test_threads[i] != null)
{
if (Test_threads[i].IsAlive)
{
if (Test_threads[i].ThreadState != ThreadState.Stopped)
{
isOver = false;
break;
}
}
}
}
for (int i = 0; i < Go_threads.Length; i++)
{
if (Go_threads[i] != null)
{
if (Go_threads[i].IsAlive)
{
if (Go_threads[i].ThreadState != ThreadState.Stopped)
{
isOver = false;
break;
}
}
}
}
if (isOver)
{
this.text_begin.Text = (int.Parse(this.text_begin.Text) - 2).ToString();

dt.Clear();
if (this.dt.Rows.Count == 0)
{
for (int i = begin; i <= end; i++)
{

DataRow dr = dt.NewRow();
dr["URL"] = this.text_url.Text.Replace("(*)", i.ToString());
dr["id"] = i.ToString();
this.dt.Rows.Add(dr);
}
this.dataGridView1.Refresh();
}
StopThread(Go_threads);

for (int i = 0; i < this.dt.Rows.Count; i++)
{
Go_threads[i] = new Thread(new ParameterizedThreadStart(Go_Thread));
//Go_threads[i].Name = "thread_" + i.ToString();
Go_threads[i].Start(i);
}
}
}

求你们了……看一下吧……
...全文
380 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
找到问题了,要结贴了,我把问题代码段传上来大家看看 哪里不一样的就知道问题所在了。其实就是我在20楼说的问题。
这是修改后的

try
{

//Send request

Stream requestStream= this.req.GetRequestStream();


requestStream = this.req.GetRequestStream();

requestStream.Write(paramBytes, 0, paramBytes.Length);
requestStream.Close();

this.resp = (HttpWebResponse)this.req.GetResponse();
Encoding myEncoding = Encoding.Default;
if (this.resp.Headers["Content-Type"].Contains("utf-8"))
{
myEncoding = Encoding.GetEncoding("utf-8");
}
else if (this.resp.Headers["Content-Type"].Contains("GBK"))
{
myEncoding = Encoding.GetEncoding("GBK");
}
else if (this.resp.Headers["Content-Type"].Contains("GB2312"))
{
myEncoding = Encoding.GetEncoding("GB2312");
}

StreamReader myStreamReader = new StreamReader(new GZipStream( resp.GetResponseStream(),CompressionMode.Decompress),myEncoding);

this.data = myStreamReader.ReadToEnd();
myStreamReader.Close();
ret_str = "success";
return ret_str;
}

这是之前的

try
{

//Send request

Stream requestStream= this.req.GetRequestStream();


requestStream = this.req.GetRequestStream();

requestStream.Write(paramBytes, 0, paramBytes.Length);
requestStream.Close();

this.resp = (HttpWebResponse)this.req.GetResponse();
Encoding myEncoding = Encoding.Default;
if (this.resp.Headers["Content-Type"].Contains("utf-8"))
{
myEncoding = Encoding.GetEncoding("utf-8");
}
else if (this.resp.Headers["Content-Type"].Contains("GBK"))
{
myEncoding = Encoding.GetEncoding("GBK");
}
else if (this.resp.Headers["Content-Type"].Contains("GB2312"))
{
myEncoding = Encoding.GetEncoding("GB2312");
}

StreamReader myStreamReader = new StreamReader(new GZipStream( resp.GetResponseStream(),CompressionMode.Decompress),myEncoding);

this.data = myStreamReader.ReadToEnd();
ret_str = "success";
return ret_str;
}

看出来的,请用板砖砸死我吧,我不想活了。真他妈的始终不能细心。纠结我啊!

感谢大家关心我给我动力!我痛哭流涕……
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

你能确保在timer访问时,线程数组中的线程都有效吗,如果一个线程执行完毕,会自动结束的
[/Quote]
我加了判断的……上面有代码……
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

你的程序结构很不合理,写的人会疯,用的人也会疯的。
[/Quote]
我没怎么考虑结构啊,本来很简单的一个小工具,总共也没有2000行代码,可是这个问题好纠结。
bdmh 2012-05-30
  • 打赏
  • 举报
回复
你能确保在timer访问时,线程数组中的线程都有效吗,如果一个线程执行完毕,会自动结束的
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
引用 18 楼 的回复:

我建议你的 Go_Thread 方法开始和结束的地方向控制台输出一下index,比如开头地方就 index + " start" ,结尾处就 index + " end" ,button1_Click_1 和 timer1_Tick 里输出一下 this.dt.Rows.Count ,不要断点,运行后看输出的内容,看看是不是真的线程丢失了。


C# code……
[/Quote]
加上 Go_threads[i].IsBackground = true;
104915562 2012-05-30
  • 打赏
  • 举报
回复
可以一个一个执行啊,不能让他们同时执行,加锁之类的
码农-彬少 2012-05-30
  • 打赏
  • 举报
回复
showlie 2012-05-30
  • 打赏
  • 举报
回复
你的程序结构很不合理,写的人会疯,用的人也会疯的。
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

我建议你的 Go_Thread 方法开始和结束的地方向控制台输出一下index,比如开头地方就 index + " start" ,结尾处就 index + " end" ,button1_Click_1 和 timer1_Tick 里输出一下 this.dt.Rows.Count ,不要断点,运行后看输出的内容,看看是不是真的线程丢失了。
[/Quote]
MessageBox.Show("startStream" + url.ToString());
Stream requestStream= this.req.GetRequestStream();
MessageBox.Show("endStream" + url.ToString());

就是这句话,Stream requestStream= this.req.GetRequestStream();这个不是丢失了,应该是阻塞了,因为程序退出了以后这个线程还在这里卡着,这要怎么办?
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
我建议你的 Go_Thread 方法开始和结束的地方向控制台输出一下index,比如开头地方就 index + " start" ,结尾处就 index + " end" ,button1_Click_1 和 timer1_Tick 里输出一下 this.dt.Rows.Count ,不要断点,运行后看输出的内容,看看是不是真的线程丢失了。
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
经过调试发现
this.req.ContentLength = paramBytes.Length;
this.req.ContentType = "application/x-www-form-urlencoded";
//Send request
Stream requestStream = this.req.GetRequestStream();
requestStream.Write(paramBytes, 0, paramBytes.Length);
requestStream.Close();

到this.req.ContentType = "application/x-www-form-urlencoded";这行,还是正常的。
到Stream requestStream = this.req.GetRequestStream();这行,线程就只剩2个了!!!其他的就没有了?没有了!我勒个去,坑爹啊!什么意思啊?
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
经过调试发现
this.req.ContentLength = paramBytes.Length;
this.req.ContentType = "application/x-www-form-urlencoded";
//Send request
Stream requestStream = this.req.GetRequestStream();
requestStream.Write(paramBytes, 0, paramBytes.Length);
requestStream.Close();

到this.req.ContentType = "application/x-www-form-urlencoded";这行还是正常的,
到Stream requestStream = this.req.GetRequestStream();行,就只剩2个线程了,这是为什么啊?
showlie 2012-05-30
  • 打赏
  • 举报
回复
1、多线程同步问题需要注意一下
2、多个线程的话最好用线程池ThreadPool
3、如果想循环执行某个任务,最好在线程函数内的while(true)中执行任务,在任务尾部Thread.Sleep(5000)等待5s后继续执行
ONE-PIECE 2012-05-30
  • 打赏
  • 举报
回复
hack大灯 2012-05-30
  • 打赏
  • 举报
回复
怎么又沉了啊!大神在哪里啊!能不能指导一下啊……
sunylf 2012-05-30
  • 打赏
  • 举报
回复
就多了一行: myStreamReader.Close();
104915562 2012-05-30
  • 打赏
  • 举报
回复
myStreamReader.Close();
不关闭,确实盖拍了
hack大灯 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
新开的线程会有滞后,如果运行速度过快的话,线程任务尚未完成呢,所以,开线程应该慎重考虑,或用同步委托。
[/Quote]
我加了判断的啊,判断线程数组中所有的线程都停止了才重新开始下一轮的啊,跪求解释啊……%…………
  • 打赏
  • 举报
回复
新开的线程会有滞后,如果运行速度过快的话,线程任务尚未完成呢,所以,开线程应该慎重考虑,或用同步委托。
hack大灯 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
这样写代码不出问题才怪。
[/Quote]
求指导啊……最近才开始写多线程……
加载更多回复(8)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧