2017-03-21 5 views
-2

나는 두 개의 다른 클래스 인 downloadWiki와 GetLinks를 가지고 있으며, 각각은 약간의 시간이 필요한 루프가 있으며, 내 버튼과 진행률 막대가있는 Form.cs 클래스가 있습니다.다른 클래스가있는 WindowsForm에서 Progressbar와 함께 BackgroundWorker 사용

내 downloadWiki에는 다른 HTML 페이지를 반복하는 루프가 있으며 GetLinks 클래스에는 각 Wiki 페이지의 모든 링크를 가져 와서 내 downloadWiki 클래스로 보내는 루프가 있습니다. 몇 가지 if 문 다음에 위키를 다운로드합니다. 내 문제는 링크를 사용하여 루프의 진행률 표시 줄과 배경 작업자를 구현하고 지난 2 시간 동안 위키피지를 다운로드하는 작업을 시도했습니다. 하지만 해결책을 찾지 못했습니다. 이것은 내 Windows Forms 코드에서 실행되는 코드입니다. 그래서 backgroundWorker를 두 클래스에 보내는 방법을 모르겠습니다.

코드가 더 필요하면 의견을 보내주십시오. 당신은 ProgressBar를 원하는

public FrmMain() 
    { 
     InitializeComponent(); 

     _backgroundWorker.WorkerReportsProgress = true; 
     _backgroundWorker.ProgressChanged += _backgroundWorker_ProgressChanged; 
     _backgroundWorker.DoWork += _backgroundWorker_DoWork; 
     _backgroundWorker.RunWorkerCompleted += _backgroundWorker_RunWorkerCompleted; 
    } 

:이 구글의 질문에 쉽게,하지만 C#으로

private void button1_Click(object sender, EventArgs e) 
    { 
     DownloadWikis wikis = new DownloadWikis(); 
    } 
+3

표준 ProgressBar 질문입니다. 얼마나 오래 걸릴지 알면 * 작동 할 수 있습니다. 당신은 결코 알지 못한다. 서버는 당신에게 말하지 않는다. 고정 된 수의 URL을 가지고있는 경우 URL을 고정시킬 수 있습니다. ProgressBar.Style을 "움직이는 텍스트"로 설정하십시오. 대폭 쓸모없는 발췌 문장. –

+0

미안하지만, 대부분의 코드가 생성자에 있고 다른 클래스로 분리되어 있기 때문에 추가해야 할 코드가 무엇인지 알 수 없습니다. 또한 조언을위한 thx. –

답변

0

먼저 "초보자"이야 경우

죄송합니다, 당신은 당신의 경우 BackgroundWorker를 구성해야 따라서 backgroundWorker는 진행 상황을보고해야합니다. 작업은 비동기 적으로 수행되므로 다운로드가 실행될 위임자를 지정해야합니다.

private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DownloadWikis wikis = new DownloadWikis(); 

    } 

DownloadWikis 클래스에는 대리인을 작성하십시오. backgroundworker ReportProgress 메서드를 호출하는 데 도움이 될 것입니다.

 public delegate void ReportProgressDelegate(int percentage); 

업데이트 다운로드 서명, 그것은 다음과 같이해야한다 : 이제

public void Download(ReportProgressDelegate reportProgress) 
    { 
     // FirstLoop 
     for(int i=0; i < 100; i++) 
     { 
      // Do some work with GetLinks 
      // this will call the backgroundworker ReportProgress method. 
      reportProgress(i); 
     } 
    } 

,이에 완료 할 수 있습니다

private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DownloadWikis wiki = new DownloadWikis(); 
     wiki.Download(_backgroundWorker.ReportProgress); 
    } 

가 진행 막대 값을 처리하기 위해, 두 번째 위임 여기에 있습니다 :

 private void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
    } 
 private void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     MessageBox.Show("It's done !"); 
    } 

마지막 단계, 쉬운 일 : 작업을 완료 할 때이 단계를 0, 당신이 볼 수있을 것이다 이제

private void btnDownloadWikis_Click(object sender, EventArgs e) 
    { 
     _backgroundWorker.RunWorkerAsync(); 
    } 

을, 당신은 몇 가지 수학이 결정합니까해야 할 당신의 백분율.

+0

대단히 감사합니다! 너의 anwer는 나를 많이 도왔다. 그리고 내 코드의 간단한 설명과 예제를 유감스럽게 생각합니다. 5 분 후 Progressbar와 Backgroundworker가 작동하게되었습니다. –

관련 문제