J'utilise le fond Travailleurs tout le temps, ils sont parfaits pour le traitement des actions à long terme.
de votre code
#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);
}
tout ce que vous devez faire est d'appeler la méthode:
ProcessMyRequest();
et il fera le travail. Si vous devez laisser le thread principal d'être au courant des progrès, vous pouvez utiliser la dans la méthode bkgWorkerMyRequest_DoWork
événement ProgressChanged
private void bkgWorkerMyRequest_ProgressChanged(
object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
vous devez modifier le code pour avoir
//reports a percentage between 0 and 100
bkgWorkerMyRequest.ReportProgress(i * 10);
Rappelez-vous :
alt text http://www.balexandre.com/temp/2010-04-07_1200.png
Vous cependant se coincer lorsque vous essayez de déboguer la méthode GetStuffDone
comme il est que ce que je fais un peu dur débogage des applications multithread
Alors, est, tout debug sans travailleurs et appliquer les travailleurs. Fonctionne bien pour moi, laissez-moi savoir si vous avez besoin d'aide supplémentaire à ce sujet.
ajouté
Je ne l'ai pas au courant que vous obtenez la grille du travailleur, désolé, pour cela, il suffit d'envoyer la grille comme argument et de l'utiliser, s'il vous plaît changer:
bkgWorkerMyRequest.RunWorkerAsync(dataGridView1);
string r = GetStuffDone((GridView)e.Argument);
private function string GetStuffDone(GridView dataGridView1)
Quelle est la question? – leppie
Je suis vraiment confus avec background-worker. Obtenir des rapports contradictoires sur ce qu'il faut faire. Je ne sais pas comment intégrer mon code ci-dessus dans un événement doWork. –