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();
        }

Regex作为后台进程

下面是一些使用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线程。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

如果你使用的是。net framework 4.5,你应该考虑使用asyncawait

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx