2010-04-07 7 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

나는 항상 배경 근로자를 사용하며 오랜 시간 행동을 처리하는 데 적합합니다.

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) 
+0

2 가지 : 진행률 막대를 얻으려면 // 0에서 100 사이의 백분율을보고합니다. bkgWorkerMyRequest.ReportProgress (i * 10); _DoWork .. 안에 .. 그러나 나는 어디서 왔는가? # 2. 오류 비 정적 필드, 메서드 또는 속성 'SOAP_Client_Networth.Form1.dataGridView1' –

+0

에 대해 개체 참조가 필요합니다. 정수를 설정해야합니다. 작업 완료를 알리는 책임이 있습니다. .NET 몰라요. * 10은 당신을 백분율로 기억하고 있습니다. 다른 스레드 객체에 액세스 할 수 없으면 안전 스레드 호출을 사용해야합니다. 주 스레드 개체에 액세스 할 수있는 유일한 곳은 RunWorkerCompleted입니다. 그러나 이것은 다른 질문입니까? ;-) – balexandre

+0

지금 컴파일됩니다. 그러나 실행할 때이 오류가 발생합니다. 이 BackgroundWorker는 진행률을보고하지 않는다고 설명합니다. WorkerReportsProgress를 수정하여 진행 상황을보고하도록 지정합니다. –

0

BackgroundWorker (인스턴스 "bgw")를 만들고 "bgw.DoWork + ="다음에 TAB TAB을 입력하십시오. 그런 다음 Visual Studio는 DoWork 이벤트 처리기 메서드를 생성합니다. 위의 코드를 핸들러와 voila에 복사하십시오.

진도가 영향을 미치지 않는 웹 서비스 요청의 지속 시간에 의해 결정되므로 진행 상황을보고하는 것이 바람직하지 않다고 생각합니다. 더 작은 작업으로 나눌 수는 없습니다. 따라서 "작업 중"대화 상자를 표시하고 백그라운드 작업을 시작하여 웹 서비스를 호출하십시오. 작업이 완료되면 대화 상자를 닫습니다.