BITS 作业状态
有四类 BITS 状态:正在启动、操作中、已传输和最终。 当作业运行时,它会在不同的状态类中的状态之间转换。 作业处于最终状态后,它不会移出最终状态,也不会显示在作业枚举中。
状态更改方法
作业有四种状态更改方法:取消、完成、恢复和挂起。 只要作业不处于最终状态,就可以调用任何状态更改方法。
挂起方法用于将作业切换到“已挂起”状态。 当作业挂起时,其所有传输都将停止,直到调用“恢复”才会恢复。 已挂起作业只会保持挂起状态。
恢复方法用于启动挂起的作业。 将设置错误或暂时性错误状态的作业以重试。 当前处于操作状态的作业将保持该状态。
取消方法用于取消作业。 状态将切换到已取消。 当前传输的任何文件都不会完成。 将删除所有完全传输和部分传输的文件。
完成方法将完成传输。 将保留所有完全下载的文件;未完全传输的文件将被删除。
必须调用“取消”或“完成”,才能将作业变为最终状态并清理。 未转换为最终状态的作业将浪费系统资源。 BITS 最终会自动取消旧作业。 默认 JobInactivityTimeout 是在 90 天后取消作业。
开始状态
起始状态为 SUSPENDED。 在此处,可以将文件添加到作业并设置作业和文件属性。 若要启动作业传输,请对作业调用“恢复”。 如果恢复没有文件的作业,它将返回 BG_E_EMPTY 错误代码,作业将保持挂起状态。
操作状态
已排队、正在连接和正在传输状态显示作业的当前内部活动。 “已排队”作业已准备好进行计划,可能等待 BITS 计划程序或等待用户登录。 正在连接的作业正在尝试连接到服务器以开始传输文件。 正在传输的作业正在主动上传或下载文件。
暂时性错误状态表示作业已尝试且无法传输文件。 这可能是由于网络策略原因造成的;作业可能被阻止,因为当前网络太贵。 也可能因为系统原因(如系统处于节电模式或游戏模式)或没有 Internet 连接而被阻止。
如果适用,处于暂时性错误状态的作业将由 BITS 自动重试。 BITS 包括 MinimumRetryDelay 和 NoProgressTimeout 值,用于控制何时重试作业,以及何时 BITS 最终停止重试。
已传输状态
已传输状态在不再进行传输时发生。 必须取消或完成处于此状态的作业。 还可以添加更多文件来传输和调用 Resume(),但这不是一种常见做法。
当传输完成(不会重试)但未完全成功时,将发生 ERROR 状态。 必须传输所有文件才能成功;如果有任何永久失败,作业将出错。 通常调用“取消”或“完成”将作业变为最终状态。 实际区别在于,调用“取消”时,将删除任何已成功传输的文件,但如果调用“完成”,则不会删除任何已成功传输的文件。
处于错误状态的原因包括
- 长时间处于暂时性错误状态(超出 NoProgressTimeout 设置)。
- 获取 BG_E_TOKEN_REQUIRED 错误,需要帮助程序令牌方面的帮助
重新配置 ERROR'd 作业,然后调用 Resume 重试作业是一种常见做法。 例如,应用可能需要通过 SetRemoteName 更新文件的远程名称。
传输完成且成功时,将发生 TRANSFERRED 状态。 必须调用“完成”才能完成作业;对于下载作业,下载的文件在调用完成之前将不可用。 此规则的例外是高性能作业(仍应调用“完成”)的作业。
最终状态
作业处于最终状态后,无法调用任何状态更改的方法。 调用 Complete() 后,作业将得到确认,所有已完成的下载文件都将可用。 调用 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。