当使用后台传输进行下载时,下载操作可以看作沙箱内的DownloadOperation 对象,该对象具有一系列用于暂停,恢复,重启和撤销下载操作的控制方法。
下面是一个下载的例子
前台布局
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Orientation="Horizontal" Height="50" Margin="0,0,0,718">
<TextBlock Text="下载地址:" FontSize="30"/>
<TextBox Name="serverAdderssField" Width="300" Height="40"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="50" Margin="0,64,0,654">
<TextBlock Text="存储文件名" FontSize="30"/>
<TextBox Name="fileNameField" Width="250" Height="40"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,231,0,241">
<Button Name="startDownloadButton" Content="开始下载" Click="startDownloadButton_Click"/>
<Button Name="pauseAllButton" Content="暂停" Click="pauseAllButton_Click"/>
<Button Name="resumeAllButton" Content="恢复" Click="resumeAllButton_Click"/>
<Button Name="cancelAllButton" Content="取消" Click="cancelAllButton_Click"/>
</StackPanel>
<StackPanel Margin="0,250,0,0">
<TextBlock Text="下载信息" FontSize="30"/>
<TextBlock Name="status" FontSize="20"/>
</StackPanel>
</Grid>
后台代码
public sealed partial class MainPage : Page
{
private List<DownloadOperation> activeDownloads;
private CancellationTokenSource cancellationSign;
public MainPage()
{
this.InitializeComponent();
cancellationSign = new CancellationTokenSource();
}
/// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。Parameter
/// 属性通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Load();
}
private async void Load()
{
await DiscoverActiveDownloadsAsync();
}
private async Task DiscoverActiveDownloadsAsync()
{
activeDownloads = new List<DownloadOperation>();
try
{
IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
Log("已存在的下载个数" + downloads.Count);
if (downloads.Count > 0)
{
List<Task> tasks = new List<Task>();
foreach (DownloadOperation download in downloads)
{
Log(String.Format("已经存在的下载:{0},Status;{1}",download.Guid,download.Progress.Status));
tasks.Add(HandleDownloadAsync(download,false ));
}
await Task.WhenAll(tasks);
}
}
catch (Exception ex)
{
LogException("加载以存在的下载错误:",ex);
}
}
private void LogException(string title, Exception ex)
{
WebErrorStatus error = BackgroundTransferError.GetStatus(ex.HResult);
if (error == WebErrorStatus.Unknown)
{
Log(title + ":" + ex);
}
else
{
Log(title + ":" + error);
}
}
private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
try
{
activeDownloads.Add(download);
Progress<DownloadOperation> progressCalback = new Progress<DownloadOperation>();
if (start)
{
await download.StartAsync().AsTask(cancellationSign.Token, progressCalback);
}
else
{
await download.AttachAsync().AsTask(cancellationSign.Token, progressCalback);
}
ResponseInformation response = download.GetResponseInformation();
Log(string.Format("以完成下载:{0},状态:{1}",download.Guid,response.StatusCode));
}
catch (TaskCanceledException)
{
Log("下载取消");
}
catch(Exception ex)
{
LogException("错误",ex);
}
finally
{
activeDownloads.Remove(download);
}
}
private void DownloadProgress(DownloadOperation download)
{
MarshalLog(string.Format("下载:{0},状态:{1}", download.Guid, download.Progress.Status));
double percent = 100;
if (download.Progress.TotalBytesToReceive > 0)
{
percent = download.Progress.BytesReceived * 100 / download.Progress.TotalBytesToReceive;
}
MarshalLog(string.Format("-以传输:{0}of{1},{2}%", download.Progress.BytesReceived, download.Progress.TotalBytesToReceive, percent));
if(download.Progress.HasRestarted)
{
MarshalLog("-下载重新启动");
}
}
private void MarshalLog(string value)
{
var ignore = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
Log(value);
});
}
private void Log(string message)
{
status.Text += message + "\r\n";
}
private async void startDownloadButton_Click(object sender, RoutedEventArgs e)
{
try
{
Uri source = new Uri(serverAdderssField.Text.Trim());
string destination = fileNameField.Text.Trim();
if (destination == "")
{
Log("请输入存储文件名称");
return;
}
StorageFile destinationFile = await KnownFolders.PicturesLibrary.CreateFileAsync(destination, CreationCollisionOption.GenerateUniqueName);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(source, destinationFile);
Log(String.Format("下载{0}到{1},{2}", source.AbsoluteUri, destinationFile.Name, download.Guid));
await HandleDownloadAsync(download, true);
}
catch (Exception ex)
{
LogException("下载错误:", ex);
}
}
private void pauseAllButton_Click(object sender, RoutedEventArgs e)
{
}
private void resumeAllButton_Click(object sender, RoutedEventArgs e)
{
}
private void cancelAllButton_Click(object sender, RoutedEventArgs e)
{
}
后面几个事件没有实现。