正则表达式作为后台进程

时间:2013-01-21 17:10:18

标签: c# regex multithreading

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

2 个答案:

答案 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,则应考虑使用asyncawait

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