-3

私は C# の初心者で、HttpWebRequestを使用して Web ページのソースを取得しています。さて、正規表現を使用してソースコードをスキャンして、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

UIスレッドで時間のかかるプロセスを実行しないでください。Webページのソースも非同期で取得する必要があります。これを実現する方法はたくさんありますが、最も簡単な方法の1つはおそらく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 に答える
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 に答える