BITS ジョブの状態

BITS 状態には、開始、アクション、転送、最終の 4 つのクラスがあります。 ジョブが実行されると、さまざまな状態クラスの状態間で遷移します。 ジョブが最終状態になると、最終的な状態から移動せず、[ジョブの列挙] には表示されません。

State-changing メソッド

ジョブには、CancelCompleteResume、および Suspend の 4 つの state-changing メソッドがあります。 ジョブが最終的な状態でない限り、任意の state-changing メソッドを呼び出すことができます。

Suspend メソッドは、ジョブを SUSPENDED 状態に切り替えるために使用されます。 ジョブが中断されると、その転送はすべて停止され、Resume を呼び出すまで再開されません。 既に中断されているジョブは、中断された状態のままです。

Resume メソッドは、中断されているジョブを開始するために使用されます。 エラーまたは一時的なエラー状態のジョブは、再試行されるように設定されます。 現在アクション状態にあるジョブは、その状態のままになります。

Cancel メソッドは、ジョブを取り消すために使用されます。 状態が取り消し済みに切り替わります。 現在転送中のファイルは完了しません。 完全に転送されたファイルと部分的に転送されたファイルはすべて削除されます。

Complete メソッドは転送を完了します。 完全にダウンロードされたファイルは保持されます。完全に転送されていないファイルは削除されます。

ジョブを最終的な状態に移行してクリーンするには、Cancel または Complete を呼び出す必要があります。 最終的な状態に移行されていないジョブは、システム リソースを無駄にします。 BITS は最終的に古いジョブを自動的に取り消します。 既定の JobInactivityTimeout は、90 日後にジョブを取り消します。

開始時の状態

開始状態は SUSPENDED です。 ここから、ジョブにファイルを追加して、ジョブとファイルのプロパティを設定できます。 ジョブの転送を開始するには、ジョブで Resume を呼び出します。 ファイルのないジョブを再開すると、BG_E_EMPTYエラー コードが返され、ジョブは中断された状態を維持します。

アクションの状態

QUEUEDCONNECTING、および TRANSFERRING の状態は、ジョブの現在の内部アクティビティを示します。 QUEUED になっているジョブはスケジュールする準備ができており、BITS スケジューラを待っているか、ユーザーのログインを待っている可能性があります。 CONNECTING のジョブは、ファイルの転送を開始するためにサーバーに接続しようとしています。 TRANSFERRING のジョブは、ファイルをアクティブにアップロードまたはダウンロードしています。

TRANSIENT ERROR 状態は、ジョブがファイルの転送を試行し、失敗したことを意味します。 これはネットワーク ポリシー上の理由によるものである可能性があります。現在のネットワークのコストが高すぎるため、ジョブがブロックされる可能性があります。 また、システムがバッテリー セーバーやゲーム モードになっている、インターネット接続がないなどのシステム上の理由によりブロックされる場合もあります。

一時的なエラー状態のジョブは、必要に応じて BITS によって自動的に再試行されます。 BITS には、ジョブがいつ再試行され、BITS が最終的に再試行を停止するかを制御する MinimumRetryDelay 値と NoProgressTimeout 値が含まれています。

転送済み状態

転送済み状態は、これ以上転送されない場合に発生します。 この状態のジョブを取り消すか完了する必要があります。 さらにファイルを追加して Resume() を転送して呼び出すこともできますが、これは一般的な方法ではありません。

ERROR 状態は、転送が完了したときに発生します (再試行されません)。ただし、完全には成功していません。 すべてのファイルが正常に転送されるようにする必要があります。永続的に失敗する場合、ジョブはエラーになります。 通常は、Cancel または Complete を呼び出して、ジョブを最終的な状態に移動します。 実際の違いは、Cancel を呼び出した場合、正常に転送されたファイルはすべて削除されますが、Complete を呼び出した場合、正常に転送されたファイルは削除されないことです。

ERROR 状態になる理由は次のとおりです。

ERROR のジョブを再構成してから Resume を呼び出して、ジョブを再試行するのが一般的な方法です。 たとえば、アプリで SetRemoteName を使用してファイルのリモート名を更新する必要がある場合があります。

TRANSFERRED 状態は、転送が完了し、成功したときに発生します。 ジョブを完了するには、Complete を呼び出す必要があります。ダウンロード ジョブの場合、ダウンロードしたファイルは Complete を呼び出すまで使用できません。 このルールの例外は、高パフォーマンスのジョブであるジョブです (ただし、Complete を呼び出す必要があります)。

最終状態

ジョブが最終的な状態になると、state-changing メソッドを呼び出すことはできません。 Complete() を呼び出した後、ジョブは ACKNOWLEDGED になり、ダウンロードしたすべてのファイルが使用可能になります。 Cancel() を呼び出すとジョブは CANCELLED になり、ダウンロードしたすべてのファイルが削除されます。

BITS ジョブのライフ サイクル

BITS ジョブのライフ サイクルは、ジョブの作成時に開始されます。 ジョブは、転送する 1 つ以上のファイルを含むコンテナーです。 ジョブには、BITS がファイルを転送してアプリケーションと対話する方法を指定するプロパティもあります。 たとえば、ジョブの優先順位、ジョブがアップロード ジョブかダウンロード ジョブか、通知を受信するイベントを指定できます。

ジョブを作成したら、1 つ以上のファイル (アップロード ジョブには 1 つのファイルのみを含めることができます) をジョブに追加し、アプリケーションに応じてプロパティ値のいずれかを変更します。 ジョブにファイルを追加するときは、ファイルのローカル (クライアント) 名とリモート (サーバー) 名の両方を指定します。 リモート ファイル名には、HTTP、HTTPS、または S MB (メガバイト) プロトコルを使用する必要があります。 ジョブ内のファイルは順番に処理されます (先入れ先出し)。

BITS は、ジョブの作成時に自動的に中断されます。 ジョブを転送キューでアクティブ化するには、ジョブを再開する必要があります。 ジョブはいつでも中断または再開することができます。 ジョブを再開すると、ジョブが中断状態からキューに入った状態に移動します。 ジョブは、スケジューラがジョブがファイルを転送する番であると判断するまで、キューに入れられた状態のままになります。 すべてのフォアグラウンド ジョブは、1 つのバックグラウンド ジョブと同時に実行されます。 BITS は、フォアグラウンド ジョブ内のファイルを順次処理します。

ジョブがファイルを転送する番になると、ジョブは接続状態に移行し、BITS はリモート サーバー (リモート ファイル名で指定) に接続します。 BITS がリモート サーバーに接続できる場合、ジョブは転送状態に移行し、タイム スライスが終了するか、転送が完了するか、エラーが発生するか、アプリケーションがジョブを一時停止するまで、ジョブはそのままになります。

ジョブは、BITS がジョブ内のすべてのファイルを転送するまで、キュー状態、接続状態、および転送状態の間を移動します。 その時点で、ジョブは転送された状態に移行します。 BITS はラウンドロビン スケジューリングを使用して、同じ優先度レベルのジョブをスケジュールします。 各ジョブには、そのファイルを処理するための一定の時間が与えられます。 ジョブがタイム スライス内に完了しない場合、ジョブはキューに入れられた状態に戻り、キュー内の次のジョブがアクティブ化されます。 これにより、大きなジョブが小さなジョブをブロックできなくなります。 ジョブは主に先入れ先出し (FIFO) ベースで処理されます。ただし、ラウンドロビン スケジューリング、ジョブ エラー、サービスの再起動のため、BITS は FIFO 処理を保証できません。

転送されたファイルは、アプリケーションが IBackgroundCopyJob::Complete メソッドを呼び出して BITS からユーザーにファイルの所有権を転送するまで、クライアントで使用できません。 ファイルがサーバーに正常に受信された場合、アップロード ジョブも転送済み状態に設定されます。 ファイルがサーバーに正常に送信され、サーバー アプリケーションからの応答がクライアントに正常に転送された後、アップロード応答ジョブは転送済み状態に設定されます。

エラーが発生した場合、ジョブは致命的なエラー状態または一時的なエラー状態に移動します。 致命的なエラーとは、BITS が復旧できないエラー、または修正するのに介入が必要なエラーです。 アプリケーションがエラーを修正できる場合、アプリケーションはジョブを再開し、BITS はジョブをキュー状態に移行します。 一時的なエラーは、それ自体を解決する可能性のあるエラーです。 BITS は、転送が成功するかジョブがタイムアウトになるまで、一時的なエラー状態でジョブを再試行します。アプリケーションで指定された期間内に進捗がないと、ジョブはタイムアウトになります。 ジョブがタイムアウトすると、BITS はジョブを致命的なエラー状態に移動します。

ジョブの状態の詳細については、「BG_JOB_STATE」を参照してください。