2010-04-07 2 views
1

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

Моя проблема заключается в том, что мне просто нужно сказать, что запустите обновление прогресса каждые 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); 
+3

В чем вопрос? – leppie

+0

Я действительно смущен фоном. Получение противоречивых отчетов о том, что делать. Я не знаю, как перенести мой код выше в событие doWork. –

ответ

4

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

из кода

#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); 

Запомнить :

alt text 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

2 вещи: Для того, чтобы получить прогрессбар, у вас было // сообщает процент от 0 до 100 bkgWorkerMyRequest.ReportProgress (i * 10); внутри _DoWork .. однако откуда я? # 2. Ошибка Ссылка на объект обязательна для нестатического поля, метода или свойства 'SOAP_Client_Networth.Form1.dataGridView1' –

+0

вам нужно установить это целое число, это вы должны сообщить о проделанной работе .NET. не знаю ... * 10 просто для того, чтобы явным образом помнил, что вы в процентах. Вы не можете получить доступ к другому потоку Object, вам нужно использовать вызовы Safe Thread. Единственное место, к которому вы можете обратиться к основному объекту Thread, находится в RunWorkerCompleted. Но это другой вопрос? ;-) – balexandre

+0

Теперь он компилируется. Однако я получаю эту ошибку, когда я ее запускаю. Этот BackgroundWorker утверждает, что он не сообщает о прогрессе. Измените WorkerReportsProgress, чтобы сообщить, что он сообщает о прогрессе. –

0

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

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