1

現在、私はWebサービスから大量のデータを消費する必要があるプロジェクトに取り組んでいます。入力日をサーバーに送信して結果を返すサービスクラスがあります。プロセスに時間がかかるため、プログレスバーとバックグラウンドワーカーを組み合わせたユーザーが必要ですユーザーにプロセスのパーセンテージを表示します。このトピックに関するかなりの数のサンプル コードを閲覧しましたが、それでも最適な方法を見つけることができませんでした。助けてください, 私のコードは次のとおりです,

private  MyCollection[] callWebService(string[] Inputs, string method)
{
    List<string> results = new List<string>();
    string fiel dNames = ""; // todo - fix this if nothing left in loop
    int sizeOfArray = 500;
    for (int i = 0; i < Inputs.Length; i = i + sizeOfArray)
    {
        string[] outputRecords;
        int errorCode;
        string errorString;
        string[] thisFiveHundred = createSubArray(Inputs, i, sizeOfArray);


        iq.NameValuePair[] namevaluepairs = new iq.NameValuePair[0];
        fieldNames = iqOfficeWebservice.BatchStan(method, thisFiveHundred, null, "",        out outputRecords, out errorCode, out  errorString);
        results.AddRange(outputRecords);
    }
    results.ToArray();
    IAddress[] formattedResults = convertStringsToInputs(fieldNames, results);
    return formattedResults;
}
4

3 に答える 3

8
    private void cmdButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 0; i < 101; i++)
        {
            worker.ReportProgress(i);
            System.Threading.Thread.Sleep(1000);
        }
    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
    }

追加情報については、こちらをご覧ください

于 2012-07-24T04:37:54.330 に答える
1

作業と更新をカプセル化し、イベントを適切に切り離してワーカーを破棄する、Adil の回答のバリエーションをまとめました。私の賛成票を投じる場合は、Adil の回答に賛成票を投じてください。

    private void cmdButton_Click(object sender, EventArgs e)
    {
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;

        DoWorkEventHandler doWork = (dws, dwe) =>
        {
            for (int i = 0; i < 101; i++)
            {
                worker.ReportProgress(i);
                System.Threading.Thread.Sleep(100);
            }
        };

        ProgressChangedEventHandler progressChanged = (pcs, pce) =>
        {
            lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage);
        };

        RunWorkerCompletedEventHandler runWorkerCompleted = null;
        runWorkerCompleted = (rwcs, rwce) =>
         {
             worker.DoWork -= doWork;
             worker.ProgressChanged -= progressChanged;
             worker.RunWorkerCompleted -= runWorkerCompleted;
             worker.Dispose();
             lblProgress.Text = "Done.";
         };

        worker.DoWork += doWork;
        worker.ProgressChanged += progressChanged;
        worker.RunWorkerCompleted += runWorkerCompleted;

        worker.RunWorkerAsync();
    }
于 2012-07-24T05:24:34.313 に答える
1

たとえば、WPF や Winforms での技術的な実装とは別に、考慮すべき重要な側面があります。

  • Web サービスから進行状況のフィードバックを受け取りますか?

そうでない場合、Web サービスが必要とする時間を正しく予測できない可能性があります。これは、影響を与えることができない要因 (サーバーの負荷、ネットワーク トラフィックなど) によって異なります。この場合、プログレス バーはユーザーに奇妙な体験を与えるため、お勧めしません。

次に、リクエストに数分かかる可能性があるテキスト情報を表示したり、IsIndeterminate継続的な進行状況のフィードバックを表示するフラグ セット (WPF) を使用して進行状況を表示したりするオプションがあります。バックグラウンド スレッドを使用しているため、sandhour カーソルはオプションではありません。

別の方法は、大きなリクエストを小さな部分に分割して、進捗状況を報告できるようにすることです。

于 2012-07-24T04:48:13.820 に答える