上一页 1 2 3 4 下一页
IBackgroundCopyJob job=null;
// 建立工作下载接下来的更新bcm.CreateJob("Application Update",BG_JOB_TYPE.BG_JOB_TYPE_DOWNLOAD, out jobID, out job);
// 将工作添加到文件job.AddFile(updateUrl, localLocation);job.Resume(); // 启动工作
调用job.AddFile传递要下载文件的位置、完成的本地路径和最后保存的文件名。注意任务在开始为挂起状态,在BITS服务处理工作前必须重新开始。 如果XML文件中有GUID,BITS任务就已经被初始化了。因此该GUID被传递到IBackgroundCopyManager.GetJob方法查看先前安排的下载任务是否有结果了。下一步依赖工作的状态。在下面的代码(图2)中如果工作处于错误状态,应用程序就结束该工作(它从队列中清除失败工作)并接着为相同的下载文件建立一个新工作。错误状态的最可能的原因很简单,即有名称不存在的更新。这实现了例程中的发现更新部分。 使用BITS查询更新的好处是BITS在后台工作。因此尽管查询并不是特别的优雅,非强制性的BITS下载是发现更新的可行方法。 如果处于已传输状态,应用程序接着调用IBackgroundCopyJob.Complete来结束任务。这导致文件写入目标目录,使它准备好更新。接着应用程序返回,这时下载的文件片会融合在一起。
bcm.GetJob(ref jobID, out job); //获取BITS工作对象job.GetState(out state); // 检查状态
switch(state){case BG_JOB_STATE.BG_JOB_STATE_ERROR: //如果出现错误job.Complete();xml.BitsJob = Guid.Empty;Marshal.ReleaseComObject(job);job = null;break; //继续建立新工作case BG_JOB_STATE.BG_JOB_STATE_TRANSFERRED: //如果获得了文件job.Complete(); //结束工作xml.BitsJob = Guid.Empty;return; //所有完成,返回default:return;}... // 为更新下载初始化一个新工作
图2.检查工作状态和结束工作 最后,在默认情况下图2种的例程简单地返回并忽略工作。工作可能有两种状态:正在传输状态(这意味者工作在进行中)或者瞬间错误状态。这两种状态都被认为是可以潜在成功的,因此应用程序单独留下足够空间。如果BITS任务进入瞬时错误状态,BITS服务认为该错误可以恢复,因此它再次尝试。最后,瞬时错误的任务要么成功要么BITS将它置为错误状态。 错误恢复逻辑覆盖了整个发现和下载AutoUpdater.exe应用程序组件。鉴于下载过程的更深的功能,该实现方法看起来不像网络通讯并且与通常的文件复制相似。在产品应用程序中你会发现将使用BITS API的大量其它特性的使用,例如自动传输通知、任务优先级维护和上载任务。