Я использую фоновые работники все время, они отлично подходят для обработки длительных действий.
из кода
#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)
В чем вопрос? – leppie
Я действительно смущен фоном. Получение противоречивых отчетов о том, что делать. Я не знаю, как перенести мой код выше в событие doWork. –