BITS-Auftragsstatus
Es gibt vier Klassen von BITS-Zuständen: starting, action, transfer und final. Wenn ein Auftrag ausgeführt wird, wechselt er zwischen Zuständen in den verschiedenen Zustandsklassen. Sobald sich ein Auftrag in einem endgültigen Zustand befindet, wird er nicht aus dem endgültigen Zustand verschoben und nicht in einer Auftragsenumeration angezeigt.
Zustandsverändernde Methoden
Es gibt vier zustandsverändernde Methoden für einen Auftrag: Abbrechen, Abschließen, Fortsetzen und Anhalten. Solange sich ein Auftrag nicht in einem endgültigen Zustand befindet, können Sie eine der zustandsverändernden Methoden aufrufen.
Die Suspend-Methode wird verwendet, um einen Auftrag in den Status SUSPENDED zu wechseln. Wenn ein Auftrag angehalten wird, werden alle Übertragungen beendet und erst fortgesetzt, wenn Sie Resume aufrufen. Ein Bereits angehaltener Auftrag bleibt einfach angehalten.
Die Resume-Methode wird verwendet, um einen angehaltenen Auftrag zu starten. Aufträge mit einem Fehler- oder vorübergehenden Fehlerstatus werden so eingerichtet, dass sie wiederholt werden. Aufträge, die sich derzeit im Aktionszustand befinden, bleiben in diesem Zustand.
Die Cancel-Methode wird verwendet, um einen Auftrag abzubrechen. Der Status wechselt zu "Abgebrochen". Alle Dateien, die derzeit übertragen werden, werden nicht abgeschlossen. Alle vollständig übertragenen und teilweise übertragenen Dateien werden gelöscht.
Die Complete-Methode beendet eine Übertragung. Alle vollständig heruntergeladenen Dateien werden aufbewahrt; Dateien, die nicht vollständig übertragen werden, werden gelöscht.
Sie müssen entweder Abbrechen oder Abschließen aufrufen, um Ihren Auftrag in einen endgültigen Zustand zu verschieben und bereinigt zu werden. Aufträge, die nicht in einen Endzustand übergehen, verschwenden Systemressourcen. BITS bricht schließlich automatisch alte Aufträge ab. Die Standardeinstellung JobInactivityTimeout besteht darin, Aufträge nach 90 Tagen abzubrechen.
Anfangsstatus
Der Startzustand ist ANGEHALTEN. Von hier aus können Sie dem Auftrag Dateien hinzufügen und Auftrags- und Dateieigenschaften festlegen. Um eine Auftragsübertragung zu starten, rufen Sie Resume für den Auftrag auf. Wenn Sie einen Auftrag ohne Dateien fortsetzen, wird ein BG_E_EMPTY Fehlercode zurückgegeben, und der Auftrag bleibt angehalten.
Aktionsstatus
Die Status QUEUED, CONNECTING und TRANSFERS zeigen die aktuelle interne Aktivität Ihres Auftrags an. Ein Auftrag mit QUEUED kann geplant werden und möglicherweise auf den BITS-Planer warten oder darauf warten, dass sich der Benutzer anmeldet. Ein Auftrag, der CONNECTING ist, versucht, eine Verbindung mit dem Server herzustellen, um mit der Übertragung von Dateien zu beginnen. Ein Auftrag, der ÜBERTRAGEN ist, lädt Ihre Dateien aktiv hoch oder herunter.
Der Status VORÜBERGEHENDER FEHLER bedeutet, dass der Auftrag versucht hat, die Datei zu übertragen. Dies kann aus netzpolitischen Gründen erfolgen; Der Auftrag kann blockiert werden, weil das aktuelle Netzwerk zu teuer ist. Es kann auch aus Systemgründen blockiert werden, z. B. weil sich das System im Stromsparmodus oder im Spielmodus befindet oder weil keine Internetverbindung vorhanden ist.
Aufträge im Vorübergehenden Fehlerzustand werden bei Bedarf automatisch von BITS wiederholt. BITS enthält die Werte MinimumRetryDelay und NoProgressTimeout , um zu steuern, wann ein Auftrag wiederholt wird und wann BITS schließlich den Wiederholungsversuch beendet.
Übertragene Zustände
Die übertragenen Zustände treten auf, wenn keine weiteren Übertragungen durchgeführt werden müssen. Sie müssen einen Auftrag in diesem Zustand entweder abbrechen oder abschließen. Sie können auch weitere Dateien hinzufügen, um Resume() zu übertragen und aufzurufen. Dies ist jedoch keine gängige Vorgehensweise.
Der FEHLERzustand tritt auf, wenn eine Übertragung abgeschlossen ist (es wird nicht wiederholt), aber nicht vollständig erfolgreich. Alle Dateien müssen übertragen werden, um erfolgreich zu sein; Wenn ein Auftrag dauerhaft fehlgeschlagen ist, liegt ein Fehler vor. In der Regel rufen Sie Entweder Abbrechen oder Abschließen auf, um den Auftrag in einen endgültigen Zustand zu verschieben. Der praktische Unterschied besteht darin, dass beim Aufrufen von Cancel jede erfolgreich übertragene Datei gelöscht wird, aber wenn Sie Complete aufrufen, wird keine erfolgreich übertragene Datei gelöscht.
Gründe für den Fehlerstatus sind u. a.
- Verbleibt zu lange in einem VORÜBERGEHENDEN FEHLERzustand (über die Einstellung NoProgressTimeout hinaus).
- Erhalten eines BG_E_TOKEN_REQUIRED Fehlers und Benötigen von Hilfe bei Hilfstoken
Es ist üblich, einen FEHLERauftrag neu zu konfigurieren und dann Resume aufzurufen, um den Auftrag erneut zu versuchen. Beispielsweise muss Ihre App möglicherweise den Remotenamen einer Datei über SetRemoteName aktualisieren.
Der ÜBERTRAGEN-Zustand tritt auf, wenn eine Übertragung abgeschlossen und erfolgreich war. Sie müssen Complete aufrufen, um den Auftrag abzuschließen. für Downloadaufträge sind die heruntergeladenen Dateien erst verfügbar, nachdem Sie Complete aufgerufen haben. Die Ausnahme von dieser Regel sind Aufträge, bei denen es sich um Hochleistungsaufträge handelt (und Sie sollten trotzdem Complete aufrufen).
Endgültige Zustände
Sobald sich ein Auftrag in einem endgültigen Zustand befindet, können Sie keine der Zustandsänderungsmethoden aufrufen. Der Auftrag wird bestätigt , nachdem Sie Complete() aufgerufen haben, und alle abgeschlossenen heruntergeladenen Dateien sind verfügbar. Der Auftrag wird abgebrochen, nachdem Sie Cancel() aufgerufen haben, und alle heruntergeladenen Dateien werden gelöscht.
Lebenszyklus eines BITS-Auftrags
Der Lebenszyklus eines BITS-Auftrags beginnt, wenn Sie einen Auftrag erstellen. Ein Auftrag ist ein Container, der eine oder mehrere zu übertragende Dateien enthält. Ein Auftrag verfügt auch über Eigenschaften, die angeben, wie BITS die Dateien überträgt und mit Ihrer Anwendung interagiert. Beispielsweise können Sie die Priorität des Auftrags angeben, ob es sich bei dem Auftrag um einen Upload- oder Downloadauftrag handelt und für welche Ereignisse Sie eine Benachrichtigung erhalten möchten.
Nachdem Sie den Auftrag erstellt haben, fügen Sie dem Auftrag eine oder mehrere Dateien hinzu (Uploadaufträge können nur eine Datei enthalten), und ändern Sie alle Eigenschaftswerte entsprechend Ihrer Anwendung. Wenn Sie dem Auftrag eine Datei hinzufügen, geben Sie sowohl den lokalen (Client) als auch den Remotenamen (Server) der Datei an. Der Remotedateiname muss das HTTP-, HTTPS- oder SMB-Protokoll verwenden. Dateien innerhalb eines Auftrags werden sequenziell verarbeitet (first in, first out).
BITS hält Aufträge automatisch an, wenn sie erstellt werden. Sie müssen den Auftrag fortsetzen, um ihn in der Übertragungswarteschlange zu aktivieren. Sie können einen Auftrag jederzeit anhalten oder fortsetzen. Wenn Sie den Auftrag fortsetzen, wird der Auftrag aus dem Angehaltenen Zustand in den Zustand in die Warteschlange verschoben. Der Auftrag verbleibt in der Warteschlange, bis der Planer feststellt, dass der Auftrag an der Reihe ist, Dateien zu übertragen. Alle Vordergrundaufträge werden gleichzeitig mit einem Hintergrundauftrag ausgeführt. BITS verarbeitet die Dateien in Vordergrundaufträgen seriell.
Wenn ein Auftrag dateien übertragen wird, wechselt der Auftrag in den Verbindungszustand, während BITS eine Verbindung mit dem Remoteserver herstellt (im Remotedateinamen angegeben). Wenn BITS eine Verbindung mit dem Remoteserver herstellen kann, wechselt der Auftrag in den Übertragungszustand, in dem er bis zum Ende des Slices verbleibt, die Übertragung abgeschlossen ist, ein Fehler auftritt oder die Anwendung den Auftrag anhält.
Der Auftrag wechselt zwischen den Status "In der Warteschlange", "Verbinden" und "Übertragen", bis BITS alle Dateien im Auftrag überträgt. An diesem Punkt wechselt der Auftrag in den übertragenen Zustand. BITS verwendet die Roundrobinplanung, um Aufträge mit derselben Prioritätsstufe zu planen. Jeder Auftrag erhält einen Zeitschnitt, um seine Dateien zu verarbeiten. Wenn der Auftrag während seines Zeitslices nicht abgeschlossen wird, wechselt der Auftrag zurück in den Zustand in der Warteschlange, und der nächste Auftrag in der Warteschlange wird aktiviert. Dadurch wird verhindert, dass große Aufträge kleinere Aufträge blockieren. Aufträge werden größtenteils auf fifo-Basis (First In, First Out) bearbeitet; BITS kann jedoch aufgrund von Roundrobinplanung, Auftragsfehlern und Dienstneustarts keine FIFO-Verarbeitung garantieren.
Die übertragenen Dateien sind für den Client erst verfügbar, wenn die Anwendung die IBackgroundCopyJob::Complete-Methode aufruft, um den Besitz der Dateien von BITS an den Benutzer zu übertragen. Uploadaufträge werden auch auf den übertragenen Zustand festgelegt, wenn die Datei erfolgreich vom Server empfangen wird. Upload-Reply-Aufträge werden auf den übertragenen Zustand festgelegt, nachdem die Datei erfolgreich an den Server gesendet wurde und die Antwort von der Serveranwendung erfolgreich an den Client übertragen wurde.
Wenn ein Fehler auftritt, wechselt der Auftrag in den Status schwerwiegender oder vorübergehender Fehler. Schwerwiegende Fehler sind Fehler, von denen BITS nicht wiederhergestellt werden kann oder die einen Eingriff erfordern. Wenn die Anwendung den Fehler beheben kann, setzt die Anwendung den Auftrag fort, und BITS verschiebt den Auftrag in den Zustand in der Warteschlange. Vorübergehende Fehler sind Fehler, die sich möglicherweise selbst lösen. BITS wiederholt Aufträge im Vorübergehenden Fehlerzustand, bis die Übertragung erfolgreich ist oder ein Timeout des Auftrags auftritt. Für den Auftrag tritt ein Zeitüberschreitung auf, wenn innerhalb eines anwendungsspezifischen Zeitraums kein Fortschritt erzielt wird. Wenn für den Auftrag ein Zeitüberschreitung auftritt, verschiebt BITS den Auftrag in den Status schwerwiegender Fehler.
Weitere Informationen zu Auftragszuständen finden Sie unter BG_JOB_STATE.