BITS 作業狀態

BITS 狀態有四個類別:starting、action、transferred 和 final。 當作業執行時,它會在不同的狀態類別中的狀態之間轉換。 一旦作業處於最終狀態,它就不會移出最終狀態,也不會顯示在作業列舉

狀態變更方法

作業上有四種狀態變更方法:CancelCompleteResume Suspend。 只要作業不是處於最終狀態,您就可以呼叫任何狀態變更的方法。

Suspend 方法可用來將作業切換至 SUSPENDED 狀態。 當作業暫停時,其所有傳輸都會停止,且在您呼叫 Resume 之前不會繼續。 已暫停的工作只會維持暫停狀態。

Resume 方法可用來啟動暫停的作業。 將會設定錯誤或暫時性錯誤狀態的作業,以重試。 目前處於動作狀態的作業會維持在該狀態中。

Cancel 方法可用來取消作業。 狀態會切換為已取消。 目前傳輸的任何檔案都不會完成。 將會刪除所有完全傳輸和部分傳輸的檔案。

Complete 方法將會完成傳輸。 任何完整下載的檔案都會保留;不會完全傳輸的檔案將會被刪除。

您必須呼叫 Cancel 或 Complete,才能將作業移至最終狀態並加以清除。 未轉換為最終狀態的工作將會浪費系統資源。 BITS 最終會自動取消舊的作業。 默認 JobInactivityTimeout 是取消 90 天后的工作。

啟動狀態

啟動狀態為 SUSPENDED。 您可以從這裡將檔案新增至作業,並設定作業和檔案屬性。 若要開始作業轉移,請在作業上呼叫 Resume。 如果您繼續沒有檔案的作業,則會傳回BG_E_EMPTY錯誤碼,且作業會維持暫停狀態。

動作狀態

QUEUEDCONNECTINGTRANSFERRING 狀態會顯示您作業目前的內部活動。 QUEUED 的作業已準備好排程,可能等候 BITS 排程器或等候使用者登入。 正在連線的作業正嘗試連線到伺服器以開始傳輸檔案。 傳輸作業正在主動上傳或下載您的檔案。

暫時性錯誤狀態表示作業已嘗試且無法傳輸檔案。 這可能是因為網路原則原因;作業可能會因為目前的網路太昂貴而遭到封鎖。 也可能因為系統原因而遭到封鎖,例如系統處於省電模式或遊戲模式,或因為沒有因特網連線。

適當時,BITS 會自動重試暫時性錯誤狀態中的作業。 BITS 包含 MinimumRetryDelayNoProgressTimeout 值,可控制何時重試作業,以及 BITS 最終會停止重試的時間。

已傳輸的狀態

傳輸的狀態會在沒有再進行傳輸時發生。 您必須取消或完成處於此狀態的作業。 您也可以新增更多檔案來傳輸和呼叫 Resume(),但這不是常見的作法。

錯誤狀態會在傳輸完成時發生(不會重試),但未完全成功。 所有檔案都必須傳輸成功;如果有任何永久失敗,作業將會發生錯誤。 您通常會呼叫 Cancel 或 Complete,將作業移至最終狀態。 實際差異在於,當您呼叫 Cancel 時,將會刪除任何成功傳輸的檔案,但如果您呼叫 Complete,則不會刪除任何成功傳輸的檔案。

處於錯誤狀態的原因包括

  • 在暫時性錯誤狀態中停留太長 (超出 NoProgressTimeout 設定)。
  • 取得BG_E_TOKEN_REQUIRED錯誤,並需要協助程式令牌的 協助

重新設定 ERROR'd 作業,然後呼叫 Resume 以重試作業是常見的作法。 例如,您的應用程式可能需要透過 SetRemoteName 更新檔案的遠端名稱。

傳輸完成且成功時,就會發生 TRANSFERED 狀態。 您必須呼叫 Complete 來完成作業;對於下載作業,下載的檔案在呼叫完成之前將無法使用。 此規則的例外是高效能作業的作業(您仍應呼叫 Complete)。

最終狀態

一旦作業處於最終狀態,您就無法呼叫任何狀態變更的方法。 當您呼叫 Complete() 之後,作業將會 是 ACKNOWLEDGED ,而且所有已完成的下載檔都將可供使用。 當您呼叫 Cancel() 之後,作業將會 取消 ,而且所有下載的檔案都將被刪除。

BITS 作業的生命週期

當您建立作業時,BITS 作業的生命週期就會開始。 作業是包含一或多個要傳輸之檔案的容器。 作業也有屬性,可指定 BITS 如何傳輸檔案,並與您的應用程式互動。 例如,您可以指定作業的優先順序、作業是上傳或下載作業,以及您想要接收通知的事件。

建立作業之後,請將一或多個檔案(上傳作業只能包含一個檔案)新增至作業,並視您的應用程式變更任何屬性值。 當您將檔案新增至作業時,請同時指定檔案的本機 (用戶端) 和遠端 (伺服器) 名稱。 遠端檔案名必須使用 HTTP、HTTPS 或 SMB 通訊協定。 作業內的檔案會循序處理(先進先出)。

BITS 會在建立作業時自動暫停作業。 您必須繼續作業,才能在傳輸佇列中加以啟用。 您可以隨時暫停或繼續作業。 繼續作業會將作業從暫止狀態移至佇列狀態。 工作會維持在佇列狀態,直到排程器判斷它是工作轉送檔案的回合為止。 所有前景作業都會以一個背景作業同時執行。 BITS 會串行化處理前景作業內的檔案。

當作業是傳輸檔案的回合時,作業會移至連線狀態,而 BITS 會連線到遠端伺服器(在遠端檔名中指定)。 如果 BITS 能夠連線到遠端伺服器,作業會移至傳輸狀態,直到其時間配量結束、傳輸完成、發生錯誤,或應用程式暫停作業。

作業會在佇列、連線和傳輸狀態之間移動,直到 BITS 傳輸作業中的所有檔案為止。 此時,作業會移至已傳送的狀態。 BITS 會使用迴圈配置資源排程來排程相同優先順序層級的作業。 每個作業都會獲得處理其檔案的時間配量。 如果作業在其時間配量期間未完成,作業會回到佇列狀態,並啟動佇列中的下一個作業。 這可防止大型作業封鎖較小的作業。 作業主要以先出先出(FIFO)為基礎進行處理:不過,由於迴圈配置資源排程、作業錯誤和服務重新啟動,BITS 無法保證 FIFO 處理。

在應用程式呼叫 IBackgroundCopyJob::Complete 方法,將檔案的擁有權從BITS傳送給使用者之前,用戶端才可供用戶端使用。 當伺服器成功接收檔案時,上傳作業也會設定為傳輸的狀態。 上傳回復作業會在檔案成功傳送至伺服器且伺服器應用程式的回復成功傳送至客戶端之後,設定為已傳送的狀態。

如果發生錯誤,作業會移至嚴重或暫時性錯誤狀態。 嚴重錯誤是 BITS 無法從 中復原或需要介入才能修正的錯誤。 如果應用程式能夠修正錯誤,應用程式會繼續作業,而BITS會將作業移至佇列狀態。 暫時性錯誤是可能自行解決的錯誤。 BITS 會重試暫時性錯誤狀態的工作,直到傳輸成功或作業逾時為止。當應用程式指定的期間內沒有進行任何進度時,作業就會逾時。 如果作業逾時,BITS 會將作業移至嚴重錯誤狀態。

如需作業狀態的詳細資訊,請參閱 BG_JOB_STATE