BackgroundWorker Требуется помощь - PullRequest
1 голос
/ 07 апреля 2010

У меня есть код, который выполняет запрос веб-службы. При выполнении этого запроса мне нужно, чтобы индикатор прогресса двигался независимо.

Моя проблема в том, что мне нужно просто сказать, что запускать обновление прогресса каждые 1 или 2 секунды и проверять, завершен ли ход запроса.

NetBasisServicesSoapClient client = new NetBasisServicesSoapClient();
            TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1];
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                transactions[i] = new TransactionDetails();
                transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value;
                transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value;
                transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value;
                transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value;
                transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value;
            }
            CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true);
            string result1 = ConvertStringArrayToString(result.Details);

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

Я постоянно использую Background Workers, они отлично подходят для обработки длительных действий.

из вашего кода

#region Background Work of My Request

    private void ProcessMyRequest()
    {            
        if (!bkgWorkerMyRequest.IsBusy)
        {
            lblMessageToUser.Text = "Processing Request...";
            btnProcessRequest.Enabled = false;
            bkgWorkerMyRequest.RunWorkerAsync();
        }
    }
    private void bkgWorkerMyRequest_DoWork(object sender, DoWorkEventArgs e)
    {
        // let's process what we need in a diferrent thread than the UI thread
        string r = GetStuffDone();
        e.Result = r;
    }
    private void bkgWorkerMyRequest_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        string myResult = (String)e.Result;    

        lblMessageToUser.Text = myResult;
        btnProcessRequest.Enabled = true;
    }

#endregion

    private function string GetStuffDone() 
    {
        NetBasisServicesSoapClient client = new NetBasisServicesSoapClient();
        TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1];
        for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
        {
            transactions[i] = new TransactionDetails();
            transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value;
            transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value;
            transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value;
            transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value;
            transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value;
        }
        CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true);
        return ConvertStringArrayToString(result.Details);
    }

все, что вам нужно сделать, это вызвать метод:

ProcessMyRequest();

и он сделает свою работу. Если вам нужно, чтобы основной поток узнал о прогрессе , вы можете использовать ProgressChanged событие

private void bkgWorkerMyRequest_ProgressChanged(
    object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

в методе bkgWorkerMyRequest_DoWork, для которого нужно изменить код наиметь

//reports a percentage between 0 and 100
bkgWorkerMyRequest.ReportProgress(i * 10); 

Помните:

альтернативный текст http://www.balexandre.com/temp/2010-04-07_1200.png

Однако вы застрянете при попытке отладки метода GetStuffDoneтак как это довольно сложная отладка многопоточных приложений

Итак, что я делаю, отлаживаю все без рабочих, а затем применяю рабочие.дополнительная помощь по этому вопросу.


добавлено

Я не знал, что вы получаете Сетка на рабочем месте, извините, для этого просто отправьтеСетка в качестве аргумента и используйте его, пожалуйста, измените:

bkgWorkerMyRequest.RunWorkerAsync(dataGridView1);

string r = GetStuffDone((GridView)e.Argument);

private function string GetStuffDone(GridView dataGridView1)
0 голосов
/ 07 апреля 2010

Создайте BackgroundWorker (вызовите экземпляр "bgw") и введите "bgw.DoWork + =", а затем TAB TAB. Затем Visual Studio генерирует метод обработчика событий DoWork. Скопируйте код выше в обработчик и вуаля.

Я не думаю, что вам имеет смысл сообщать о прогрессе, поскольку ваш прогресс определяется продолжительностью запроса веб-службы, на который вы не имеете никакого влияния (и вы не можете разбить его на более мелкие задачи). Поэтому просто откройте диалоговое окно «выполнение работы» и запустите фоновую задачу для вызова веб-службы. Когда это будет сделано, закройте диалоговое окно «выполнение работы».

...