Frage

Ich möchte einen Job in einem neuen Thread starten oder Background verwenden, es zu tun, aber getan haben, dass vor und Sie wich Art und Weise zu fragen ich es tun sollte.

Mein Programm hat eine Datagridview mit einer Liste von Dateien, eine Datei pro Zeile. Ich möchte, dass die Benutzer in der Lage sein, um eine Zeile auszuwählen und drücken Sie dann „Download starten“, um einen Hintergrundjob des Download zu starten. Ich mag Ereignisse des Fortschritts des Downloads kommen.

Ich habe eine Klasse clsDownload, die alles behandelt und löst Ereignisse zurück, aber wie implementiere ich das backgroundworking?

Sollte verwende ich die System.ComponentModel.BackgroundWorker innerhalb der Klasse oder etwas Wrapper erstellen, die diese Griffe oder eine andere Threading Sachen benutzen?

Danke.

Edit: Ich verstehe nicht, wie meinen Download im Background zu implementieren, jedes kleines Beispiel wäre sehr schön. Das Beispiel auf Msdn didnt mich weit.

Ich habe eine Download-Klasse, die eine start-Funktion hat. Soll ich den Background in der Klasse oder in den Anrufern? "Gefühl dumm"

War es hilfreich?

Lösung

Ich habe mehrere verschiedene Klassen erstellt, die Background integrieren. Was ich in der Regel tut, ist eine Background Komponente auf dem Formular, das geöffnet wird, wenn der Auftrag ausgeführt wird, dann gehe ich diese Instanz an den Konstruktor meiner Jobklasse.

Hier ist, was Ihre Job-Klasse aussehen könnte:

Private m_bwMain As BackgroundWorker

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

    'additional setup code here
End Sub

Um einen Auftrag zu starten, würden Sie so etwas wie dies in den Click-Ereignishandler von Ihrer Start-Schaltfläche Download tun:

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

ich meine Job-Klasse als privates Mitglied der aktuellen Form erklären, dann ist es im Falle BackgroundWorker.DoWork instanziiert. Von dort können Sie Ihre Methode aufrufen, eine Datei herunterzuladen:

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

Um die Fortschritte an den Benutzer zu melden, können Sie die Ereignisse von Ihrer Klasse in Ihrer Hauptform angehoben behandeln. Sie müssen nur sicher, dass Objektdeklaration die Job-Klasse machen das Schlüsselwort Withevents hat. Aus diesen Handler können Sie den Report Methode des Background nennen. Von innerhalb Report können Sie, was Änderungen an der Benutzeroberfläche müssen Fortschritte machen, um anzuzeigen. Hier ein Beispiel:

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

Hope, das hilft.

Andere Tipps

ich Ihnen nur das Herunterladen tun werden und brauchen nicht auf andere Asynchron-Verarbeitung, können Sie einfach die Asynchron-Methoden der Verwendung WebClient Klasse. Obwohl, da Sie bereits Ihre eigene Klasse haben, das ist wahrscheinlich keine Lösung für Sie.

Sie können aber verwenden BackgroundWorker als du erwähntest. Die MSDN-Seite hat ein Beispiel, wie es geht.

EDIT: Die Kurzgeschichte ist:

  • Sie erstellen die BackgroundWorker von dem Anrufer;
  • Wenn Sie die Hintergrundarbeit beginnen möchten, rufen Sie BackgroundWorker.RunWorkerAsync;
  • in der DoWork Event-Handler Sie die Hintergrundarbeit zu tun, die Sie in Ihrem Fall Ihre Download-Klasse starten;
  • , während Sie die Hintergrundarbeit tun, haben Sie jeder einmal in eine Weile für CancelationPending zu überprüfen;
  • , wenn Sie einige Fortschritte berichten wollen, müssen Sie es in Prozent berechnen und rufen ReportProgress.

Und wenn Sie etwas wirklich besonders angefertigt, dann können Sie immer Ihre eigene Thread .

Ich würde haften persönlich mit BackgroundWorker. Es hat eine schöne Reihe von Benachrichtigungen für verschiedene Stufen des Auftrags. Wenn Sie Thread verwenden, müssen Sie diese youself implementieren.

ich würde auch sicherstellen, dass der Code nicht zu viele Fälle nicht erstellen. Sie wollen die Anzahl der concurent Downloads begrenzen und alle Vergangenheit, die Zahl Warteschlange.

Ich würde stark BackgroundWorker beraten, wenn Sie Feedback an den Benutzer auf der Benutzeroberfläche zur Verfügung stellen müssen. Die ProgressChanged und RunWorkerCompleted Ereignisse werden auf dem UI-Thread ausgeführt werden, so gibt es keine Notwendigkeit Rangierung zu tun, die Ihren Code komplexer machen.

Die Background sieht aus wie es funktionieren soll ... Es ist ein Beispiel auf MSDN.

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

Oder Sie könnten so etwas wie:

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

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

Abhängig welche Parameter falls Sie für das Thema benötigen.

Die Klasse, die clsDownload (wahrscheinlich die Form-Klasse) verwendet, sollte Background verwenden, um die Download-Methode ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top