Regex作为后台进程
本文关键字:后台进程 Regex | 更新日期: 2023-09-27 17:55:03
我是c#初学者&我使用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();
}
下面是一些使用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
永远不要在UI线程上执行耗时的进程。您也应该异步检索网页源。有许多方法可以实现这一点,但最简单的方法之一可能是BackgroundWorker
。它包括一个方便的方法来报告进度回UI线程。
如果你使用的是。net framework 4.5,你应该考虑使用async
和await
。