나는 항상 배경 근로자를 사용하며 오랜 시간 행동을 처리하는 데 적합합니다.
ProcessMyRequest();
하고 일을 할 것입니다 : 코드
#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);
}
당신이해야 할 모든에서
는
메소드를 호출합니다. 진행중인 알아야 할 주요 실을 수 있도록해야하는 경우 , 당신은 당신이
//reports a percentage between 0 and 100
bkgWorkerMyRequest.ReportProgress(i * 10);
기억하도록 코드를 변경해야 bkgWorkerMyRequest_DoWork
방법에 ProgressChanged
이벤트
private void bkgWorkerMyRequest_ProgressChanged(
object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
을 사용할 수 있습니다 :
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 이벤트로 랩핑하는 법을 모르겠습니다. –