-3

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

2 回答 2

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
于 2013-01-21T17:25:31.683 回答
0

永远不要在 UI 线程上执行耗时的进程。您还应该异步检索网页源。有很多方法可以实现这一点,但最简单的方法之一可能是BackgroundWorker. 它包括一种将进度报告回 UI 线程的便捷方法。

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

如果您使用的是 .NET Framework 4.5,则应考虑使用asyncand await

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

于 2013-01-21T17:44:13.063 回答