C#多线程假死问题(win form)
最近写程序遇到一个棘手的问题Threadt1=newThread(newThreadStart(ss1));t1.Priority=ThreadPriority.High...
最近写程序遇到一个棘手的问题
Thread t1 = new Thread(new ThreadStart(ss1));
t1.Priority =ThreadPriority.Highest;
t1.Start();
如果这个时候加多一行
t1.Join()
就会引起界面假死
ss1代码具体如下
//step1: get html from url
//http://www.songtaste.com/user/351979/
string urlToCrawl = txbUrlToCrawl.Text;
//generate http request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlToCrawl);
//use GET method to get url's html
req.Method = "GET";
//use request to get response
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
string htmlCharset = "GBK";
//use songtaste's html's charset GB2312 to decode html
//otherwise will return messy code
Encoding htmlEncoding = Encoding.GetEncoding(htmlCharset);
StreamReader sr = new StreamReader(resp.GetResponseStream(), htmlEncoding);
string respHtml = sr.ReadToEnd();
rtbExtractedHtml.Text = respHtml;
string h1userP = @"<h1\s+class=""h1user"">(?<h1user>.+?)</h1>";
Match foundH1user = (newRegex(h1userP)).Match(rtbExtractedHtml.Text);
if (foundH1user.Success)
{
//extracted the expected h1user's value
txbExtractedInfo.Text = foundH1user.Groups["h1user"].Value;
}
else
{
txbExtractedInfo.Text = "Not found h1 user !";
}
}
感觉是SS1里面不知道哪里引起,请各路高人帮忙,谢谢! 展开
Thread t1 = new Thread(new ThreadStart(ss1));
t1.Priority =ThreadPriority.Highest;
t1.Start();
如果这个时候加多一行
t1.Join()
就会引起界面假死
ss1代码具体如下
//step1: get html from url
//http://www.songtaste.com/user/351979/
string urlToCrawl = txbUrlToCrawl.Text;
//generate http request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlToCrawl);
//use GET method to get url's html
req.Method = "GET";
//use request to get response
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
string htmlCharset = "GBK";
//use songtaste's html's charset GB2312 to decode html
//otherwise will return messy code
Encoding htmlEncoding = Encoding.GetEncoding(htmlCharset);
StreamReader sr = new StreamReader(resp.GetResponseStream(), htmlEncoding);
string respHtml = sr.ReadToEnd();
rtbExtractedHtml.Text = respHtml;
string h1userP = @"<h1\s+class=""h1user"">(?<h1user>.+?)</h1>";
Match foundH1user = (newRegex(h1userP)).Match(rtbExtractedHtml.Text);
if (foundH1user.Success)
{
//extracted the expected h1user's value
txbExtractedInfo.Text = foundH1user.Groups["h1user"].Value;
}
else
{
txbExtractedInfo.Text = "Not found h1 user !";
}
}
感觉是SS1里面不知道哪里引起,请各路高人帮忙,谢谢! 展开
3个回答
展开全部
这情况不是SS1引起的,是因为Join。
Thread.Join本意即为阻塞当前线程,等待子线程结束,在UI线程里调用Join方法,自然会出现界面暂时失去响应。这里为什么要调用Join呢?感觉不是很有必要。
Thread.Join本意即为阻塞当前线程,等待子线程结束,在UI线程里调用Join方法,自然会出现界面暂时失去响应。这里为什么要调用Join呢?感觉不是很有必要。
更多追问追答
追问
但是Join应该是等待子线程结束然后就会返回主线程吧,而现在是界面完全失去响应,而不是暂时,等了很久都没反应,所以才推断是SS1出了问题。再者我现在写的程序需要知道线程有没有执行完,那么,好像只有通过join这种方法了吧。
追答
因为子线程里的Web请求比较耗时,在等待子线程结束的这段过程中,UI线程是被阻塞了的,假如完成Web请求需要1分钟,那么界面在1分钟内就会失去响应。
如果使用Join,程序一定会有一段时间没有响应,长度取决与SS1的执行时间。如果只是需要知道有没有执行完,可以用别的方式呀,比如添加一个事件让主线程处理,或者在子线程结束之前调用某个函数通知主线程。
展开全部
t1.Join()
语句是让现在的线程等t1结束才往下走。
通常加这句话是因为你需要t1的运行结果。
通常来讲,多线程是一个麻烦制造者,能不用尽量不用。
个人感觉似乎异步调用好些。
语句是让现在的线程等t1结束才往下走。
通常加这句话是因为你需要t1的运行结果。
通常来讲,多线程是一个麻烦制造者,能不用尽量不用。
个人感觉似乎异步调用好些。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
t1.Start();后
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询