BITS ジョブの状態
BITS 状態には、開始、アクション、転送、および最終の 4 つのクラスがあります。 ジョブが実行されると、さまざまな状態クラスの状態間で遷移します。 ジョブが最終状態になると、最終的な状態から外れることはありません。また、ジョブ列挙には表示されません。
状態を変更するメソッド
ジョブには、Cancel、Complete、Resume、および Suspendの 4 つの方法があります。 ジョブが最終的な状態でない限り、状態を変更する任意のメソッドを呼び出すことができます。
Suspend メソッドは、ジョブを SUSPENDED 状態に切り替えるために使用されます。 ジョブが中断されると、その転送はすべて停止され、Resume を呼び出すまで再開されません。 既に中断されているジョブは、中断された状態のままです。
Resume メソッドは、中断されたジョブを開始するために使用されます。 エラーまたは一時的なエラー状態のジョブは、再試行されるように設定されます。 現在アクション状態にあるジョブは、その状態のままになります。
Cancel メソッドを使用してジョブを取り消します。 状態が取り消し済みに切り替わります。 現在転送中のファイルは完了しません。 完全に転送されたファイルと部分的に転送されたファイルはすべて削除されます。
Complete メソッドは転送を完了します。 完全にダウンロードされたファイルは保持されます。完全に転送されていないファイルは削除されます。
ジョブを最終的な状態に移動してクリーンアップするには、Cancel または Complete を呼び出す必要があります。 最終的な状態に移行されていないジョブは、システム リソースを無駄にします。 BITS は最終的に古いジョブを自動的に取り消します。 JobInactivityTimeout の既定の は、90 日後にジョブを取り消します。
開始状態
開始状態が SUSPENDED 。 ここから、ジョブにファイルを追加し、ジョブとファイルのプロパティを設定できます。 ジョブの転送を開始するには、ジョブで Resume を呼び出します。 ファイルのないジョブを再開すると、BG_E_EMPTYエラー コードが返され、ジョブは中断された状態を維持します。
アクションの状態
QUEUED、CONNECTING、TRANSFERRING 状態は、ジョブの現在の内部アクティビティを示します。 QUEUED のジョブをスケジュールする準備が整い、BITS スケジューラを待機しているか、ユーザーがログインするのを待機している可能性があります。 接続中のジョブが、サーバーに接続してファイルの転送を開始しようとしています。 転送中のジョブは、ファイルをアクティブにアップロードまたはダウンロードしています。
一時的なエラー 状態は、ジョブがファイルの転送を試行し、失敗したことを意味します。 これは、ネットワーク ポリシーの理由が考えられます。現在のネットワークのコストが高すぎるため、ジョブがブロックされる可能性があります。 また、システムがバッテリー セーバーまたはゲーム モードになっているなどのシステム上の理由や、インターネット接続がないためにブロックされる場合もあります。
一時的なエラー状態のジョブは、必要に応じて BITS によって自動的に再試行されます。 BITS には、MinimumRetryDelay と NoProgressTimeout 値が含まれており、ジョブが再試行されるタイミングと BITS が最終的に再試行を停止するタイミングを制御します。
転送された状態
転送された状態は、これ以上転送されない場合に発生します。 この状態のジョブを取り消すか完了する必要があります。 さらにファイルを追加して Resume() を転送して呼び出すこともできますが、これは一般的な方法ではありません。
ERROR 状態は、転送が完了したときに発生します (再試行されません)。ただし、完全には成功しませんでした。 すべてのファイルが正常に転送されるようにする必要があります。永続的に失敗した場合、ジョブはエラーになります。 通常は、Cancel または Complete を呼び出して、ジョブを最終的な状態に移動します。 実際的な違いは、Cancel を呼び出すと、正常に転送されたファイルは削除されますが、Complete を呼び出した場合、正常に転送されたファイルは削除されません。
ERROR 状態になる理由は次のとおりです。
- 一時的なエラー状態が長すぎます (NoProgressTimeout 設定を超えています)。
- BG_E_TOKEN_REQUIRED エラーが発生し、ヘルパー トークンに関するサポートが必要
ERROR のジョブを再構成してから Resume を呼び出してジョブを再試行するのが一般的な方法です。 たとえば、アプリで SetRemoteName を使用してファイルのリモート名更新する必要がある場合があります。
TRANSFERED 状態は、転送が完了して成功したときに発生します。 ジョブを完了するには、Complete を呼び出す必要があります。ダウンロード ジョブの場合、ダウンロードしたファイルは Complete を呼び出すまで使用できません。 このルールの例外は、高パフォーマンスのジョブであるジョブです (ただし、Complete を呼び出す必要があります)。
最終的な状態
ジョブが最終的な状態になると、状態を変更するメソッドを呼び出すことはできません。 Complete() を呼び出すと、ジョブは acknowledged され、完了したすべてのダウンロードされたファイルが使用可能になります。 Cancel() を呼び出すと、ジョブは canceled され、ダウンロードしたすべてのファイルが削除されます。
BITS ジョブのライフ サイクル
BITS ジョブのライフ サイクルは、ジョブの作成時に開始されます。 ジョブは、転送する 1 つ以上のファイルを含むコンテナーです。 ジョブには、BITS がファイルを転送してアプリケーションと対話する方法を指定するプロパティもあります。 たとえば、ジョブの優先順位、ジョブがアップロード ジョブかダウンロード ジョブか、通知を受信するイベントを指定できます。
ジョブを作成したら、1 つ以上のファイル (アップロード ジョブには 1 つのファイルのみを含めることができます) をジョブに追加し、アプリケーションに応じてプロパティ値のいずれかを変更します。 ジョブにファイルを追加するときは、ファイルのローカル (クライアント) 名とリモート (サーバー) 名の両方を指定します。 リモート ファイル名には、HTTP、HTTPS、または SMB プロトコルを使用する必要があります。 ジョブ内のファイルは順番に処理されます (先入れ先出し)。
BITS は、ジョブの作成時に自動的に中断します。 ジョブを再開して転送キューでアクティブ化する必要があります。 ジョブはいつでも中断または再開できます。 ジョブを再開すると、ジョブが中断状態からキューに入った状態に移動します。 ジョブは、スケジューラがファイルを転送するジョブのターンであると判断するまで、キューに登録された状態のままになります。 すべてのフォアグラウンド ジョブは、1 つのバックグラウンド ジョブと同時に実行されます。 BITS は、フォアグラウンド ジョブ内のファイルを順次処理します。
ジョブがファイルを転送するターンになると、BITS がリモート サーバー (リモート ファイル名で指定) に接続している間、ジョブは接続状態に移動します。 BITS がリモート サーバーに接続できる場合、ジョブは転送状態に移行します。ジョブは、タイム スライスが終了するまで、転送が完了するか、エラーが発生するか、アプリケーションがジョブを中断します。
ジョブは、BITS がジョブ内のすべてのファイルを転送するまで、キューに置かれた状態、接続中、転送中の状態の間を移動します。 その時点で、ジョブは転送された状態に移行します。 BITS では、ラウンド ロビン スケジューリングを使用して、同じ優先度レベルのジョブをスケジュールします。 各ジョブには、そのファイルを処理するための一定の時間が与えられます。 ジョブがタイム スライス中に完了しない場合、ジョブはキューに格納された状態に戻り、キュー内の次のジョブがアクティブになります。 これにより、大きなジョブが小さなジョブをブロックできなくなります。 ジョブは、主に先入れ先出し (FIFO) ベースで処理されます。ただし、BITS では、ラウンド ロビン スケジューリング、ジョブ エラー、およびサービスの再起動により FIFO 処理を保証できません。
転送されたファイルは、アプリケーションが IBackgroundCopyJob::Complete メソッドを呼び出して BITS からユーザーにファイルの所有権を転送するまで、クライアントで使用できません。 アップロード ジョブは、サーバーがファイルを正常に受信したときに転送された状態にも設定されます。 アップロード/応答ジョブは、ファイルがサーバーに正常に送信され、サーバー アプリケーションからの応答がクライアントに正常に転送された後、転送された状態に設定されます。
エラーが発生した場合、ジョブは致命的なエラー状態または一時的なエラー状態に移動します。 致命的なエラーとは、BITS が復旧できないエラー、または修正に介入が必要なエラーです。 アプリケーションがエラーを修正できる場合、アプリケーションはジョブを再開し、BITS はジョブをキューに入れた状態に移動します。 一時的なエラーは、それ自体を解決する可能性のあるエラーです。 BITS は、転送が成功するかジョブがタイムアウトするまで、一時的なエラー状態のジョブを再試行します。アプリケーションが指定した期間内に進行状況が行われなかった場合、ジョブはタイムアウトになります。 ジョブがタイムアウトすると、BITS はジョブを致命的なエラー状態に移動します。
ジョブの状態の詳細については、BG_JOB_STATEを参照してください。