0

次のコードを参照してください。

foreach(string url in urls)
{
  //Method that will process url ProcessUrl(url)
  //Add eached proccessed url to a treelist
}

ProcessUrl メソッドには HttpWebRequest と HttpWebResponse があるため、時々微調整が必​​要になり、リンクが多数ある場合は時間がかかり、プログラムがハングします。

何か間違ったことに基づいている可能性があるため、実際に考えられる解決策を提案することはできません。したがって、クラッシュやハングすることなくプログラムで100%操作できる間にこのコードを実行し、それぞれが新たに処理されたリンクは、遅れることなくツリーリストに挿入されます。

4

1 に答える 1

2

バックグラウンドで長時間実行される操作を実行し、操作の結果が利用可能になったときにUIに戻すと同時に、UIの応答性を維持したい場合は、ここでBackgroundWorkerを使用するのが簡単です。

    void BeginExpensiveOperation()
    {
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += ExpensiveWork;
        worker.ProgressChanged += WorkerOnProgressChanged;

        List<string> urls = new List<string> { "http://google.com" };
        worker.RunWorkerAsync(urls);
    }

    // runs in a worker thread
    void ExpensiveWork(object sender, DoWorkEventArgs e)
    {
        var worker = (BackgroundWorker)sender;
        var urls = (List<string>) e.Argument;
        foreach (var url in urls)
        {
            //TODO: do your work here synchronously
            var result = new WebClient().DownloadString(url);

            //TODO: pass the result in the userState argumetn of ReportProgress
            worker.ReportProgress(0, result); // will raise worker.ProgressChanged on the UI thread
        }
    }

    private void WorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    {
        //this executes on the UI thread
        var value = progressChangedEventArgs.UserState;
        //TODO: use result of computation to add it to the UI
        panel.Children.Add(new TextBlock {Text = value.ToString()});
    }

プレースホルダーに問題固有のコードを入力し、//TODO:呼び出しBeginExpensiveOperation()て非同期で操作を開始します。

于 2013-02-02T08:41:02.317 に答える