문제

내가 원하는 작업을 시작하기 위해 새로운 스레드를 사용하거나 backgroundworker 지만 havent 하는 요청을 어떤 방법을 내가 해야 합니다.

내 프로그램은 datagridview 와 파일의 목록을 한 파일의 행 당.내가 원하는 사용자가 선택할 수 있게 행하고 다음을 누르면"시작"을 다운로드를 시작한 배경의 다운로드합니다.를 얻고 싶은 이벤트의 뒷면 다운로드 진행 상황.

내가 있는 클래스 clsDownload 는 모든 것을 처리하고 이벤트를 발생시킵니 다만 어떻게 구현 backgroundworking?

를 사용해야 하는 시스템입니다.당 이벤트를 처리.BackgroundWorker 의 내부 클래스를 만들거나 몇 가지는 래퍼는 이것을 처리하거나 사용이 일부 다른 스레딩까요?

감사합니다.

편집: 가를 구현하는 방법을 이해하는 내에서 다운로드 backgroundworker,모든 예를은 아주 좋은 것입니다.예 msdn didnt get me far.

나는 다운로드하는 클래스가 StartDownload-기능입니다.를 사용해야 하는 backgroundworker 에서 클래스 또는에서 호출자가?"느낌을 바보"

도움이 되었습니까?

해결책

내가 만들어 여러 가지 서로 다른 수업을 통합하는 BackgroundWorker.내가 무슨 일반적으로 하는 BackgroundWorker 구성 요소를 형성할 때 열려있는 작업이 수행되고,다음 전달하는 인스턴스를 생성자의 작업이다.

여기에는 무엇이 당신의 일 클래스를 볼 수 있습니다.

Private m_bwMain As BackgroundWorker

Public Sub New(ByVal bwMain As BackgroundWorker)
    m_bwMain = bwMain

    'additional setup code here
End Sub

하는 작업을 시작하고,당신이 할 것 다른 사이트에서 클릭의 이벤트 처리기작을 다운로드 버튼:

lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)

나가 선포하는 작업 등으로 전 구성원의 현재 형태는 다음을 인스턴스화에 BackgroundWorker.면서 이벤트입니다.거기에서 당신을 호출 할 수 있습 방법을 파일을 다운로드:

Private Sub bgwMain_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwMain.DoWork
    m_oJobEngine = New JobEngine(CType(sender, BackgroundWorker))
    m_oJobEngine.DownloadFile(CStr(e.Argument))
End Sub

진행 상황을 보고하고 사용자를 처리할 수 있습니다 이벤트에 의해 발생하는 클래스에서 당신의 주요 형태입니다.당신은 필요가 있는지 확인 작업을 개체 클래스 선언 WithEvents.에서 이러한 핸들러를 호출할 수 있습니다 ReportProgress 방법 BackgroundWorker.에서 ReportProgress 만들 수 있는 어떤 변화를 필요로 하는 UI 를 나타냅 진행됩니다.예를 들어 다음과 같습니다.

Private Sub m_oJobEngine.DownloadProgress(ByVal bgw as Backgroundworker, ByVal bytesTransferred as Long) Handles m_oJobEngine.DownloadProgress
    bgw.ReportProgress(0, bytesTransferred)
End Sub
Private Sub bgwMain_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwMain.ProgressChanged
    lblStatus.Text = CLng(e.UserState).ToString & " bytes transferred."
End Sub

이게 도움이 되었으면 좋겠습니다.

다른 팁

나는 당신은 다운로드를 할 것이고 다른 비동기 처리가 필요하지 않습니다. WebClient 수업. 비록 당신이 이미 당신의 수업을 가지고 있기 때문에, 그것은 아마도 당신을위한 해결책이 아닐 것입니다.

그렇지 않으면 사용할 수 있습니다 BackgroundWorker 당신이 언급했듯이. MSDN 페이지에는이를 수행하는 방법이 있습니다.

편집하다: 단편은 다음과 같습니다.

  • 당신은 그것을 만듭니다 BackgroundWorker 발신자로부터;
  • 배경 작업을 시작하고 싶을 때 BackgroundWorker.RunWorkerAsync;
  • 에서 DoWork 이벤트 핸들러 배경 작업을 수행하고 귀하의 경우 다운로드 클래스를 시작합니다.
  • 배경 작업을하는 동안 가끔씩 확인해야합니다. CancelationPending;
  • 몇 가지 진행 상황을보고하려면 백분율로 계산하고 전화해야합니다. ReportProgress.

그리고 정말로 사용자 정의 된 무언가가 필요하다면 언제든지 직접 만들 수 있습니다. Thread.

나는 개인적으로 고집 할 것입니다 BackgroundWorker. 작업의 다양한 단계에 대한 멋진 알림 세트가 있습니다. 사용하는 경우 Thread, 당신은 이것을 스스로 구현해야합니다.

또한 코드가 너무 많은 인스턴스를 생성하지 않도록합니다. 당신은 동시에 다운로드 수를 제한하고 그 숫자를 지나서 대기하는 것을 원합니다.

나는 강력하게 조언 할 것이다 BackgroundWorker UI의 사용자에게 피드백을 제공 해야하는 경우 그만큼 ProgressChanged 그리고 RunWorkerCompleted 이벤트는 UI 스레드에서 실행되므로 마샬링을 수행 할 필요가 없으므로 코드를 더욱 복잡하게 만들 수 있습니다.

배경 작업자는 작동 해야하는 것처럼 보입니다. MSDN에 예가 있습니다.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

또는 다음과 같은 작업을 수행 할 수 있습니다.

WaitCallBack workCallBack= new WaitCallBack(DownloadMethod);
if(!ThreadPool.QueueUserWorkItem(workCallBack, "ThreadPooled")
{
   // Unable to Pool
}

// Work has been added to pool and will execute when possible

스레드에 필요한 매개 변수에 따라 다릅니다.

clsdownload (아마도 양식 클래스)를 사용하는 클래스는 BackgroundWorker를 사용하여 다운로드 방법을 실행해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top