我是C#& amp;的初学者我正在使用 HttpWebRequest 来获取网页源代码。好吧,我正在使用正则表达式来扫描html元素 中内容的源代码。基本上,正则表达式在C#中看起来像这样。
Match m = Regex.Match(result, @"^(.*?<form .*?>(.*?)</form>.*?)+$", RegexOptions.Singleline);
我面临的唯一问题是,在此过程完成之前,我的应用程序会冻结。背景线程会帮助我吗?如果是这样,请你能帮助我用一个片段来实现它吗? ..如果我可以为用户显示进度条或其他内容,那就太棒了。
private void button1_Click(object sender, EventArgs e)
{
Thread backgroundThread = new Thread(
new ThreadStart(() =>
{
Match m = Regex.Match(result, @"^(.*?<form .*?>(.*?)</form>.*?)+$", RegexOptions.Singleline);
foreach (var capture in m.Groups[2].Captures)
{
forms.Add(capture.ToString());
}
MessageBox.Show("Thread completed!");
if (progressBar.InvokeRequired)
progressBar.BeginInvoke(new Action(() => progressBar1.Value = 0));
}
));
backgroundThread.Start();
}
答案 0 :(得分:0)
以下是一些使用System.Threading.Tasks;
的演示线程代码Task<string> GetContent(string rawContent)
{
var task = Task<string>.Factory.StartNew(ProcessContent, rawContent);
return task;
}
string ProcessContent(object source)
{
var input = (string)source;
var match = Regex.Match(input, @"^(.*?<form .*?>(.*?)</form>.*?)+$", RegexOptions.Singleline);
return match.Success ? match.Value : string.Empty;
}
替代语法:
Task<string> GetContent(string rawContent)
{
var rc = rawContent;
var task = Task<string>.Factory.StartNew(() =>
{
var match = Regex.Match(rc, @"^(.*?<form .*?>(.*?)</form>.*?)+$", RegexOptions.Singleline);
return match.Success ? match.Value : string.Empty;
});
return task;
}
用法:
var content = await GetContent(myContent); // Where myContent is your content
答案 1 :(得分:0)
永远不要在UI线程上耗费时间。您也应该异步检索网页源。有很多方法可以实现这一点,但最容易的方法之一可能是BackgroundWorker
。它包括一个方便的方法,用于将进度报告回UI线程。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
如果您使用的是.NET Framework 4.5,则应考虑使用async
和await
。
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx