Vas*_*Doe 3 c# win-universal-app
我想为BackgroundDownloader实现一个超时功能.当我达到超时时,我无法取消下载操作.所以我这样使用它:
public async void downloadFile(string fileUrl, string fileName) {
var myFolder = await StorageFolder.GetFolderFromPathAsync(Package.Current.InstalledLocation.Path);
var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
var downloader = new BackgroundDownloader();
var downloadOperation = downloader.CreateDownload(new Uri(fileUrl), myFile);
var task = Task.Run(async () => await downloadOperation.StartAsync().AsTask());
if ( task.Wait(TimeSpan.FromMilliseconds(1000)) ) {
// file is downloaded in time
} else {
// timeout is reached - how to cancel downloadOperation ?????
}
}
Run Code Online (Sandbox Code Playgroud)
我在努力:
downloadOperation.StartAsync().Cancel();
Run Code Online (Sandbox Code Playgroud)
我明白了
WinRT信息:此操作已经开始.调用AttachAsync以附加到正在运行的下载/上载.
downloadOperation.AttachAsync().Cancel();
Run Code Online (Sandbox Code Playgroud)
我明白了
抛出异常:Project.exe WinRT信息中的"System.Runtime.InteropServices.COMException":此操作未启动.调用StartAsync以启动操作.附加信息:在意外时间调用方法.
任何想法都会被贬低!
小智 6
当我达到超时时,我无法取消下载操作.我在尝试:downloadOperation.AttachAsync().Cancel();
根据我的测试,downloadOperation.AttachAsync().Cancel();在我的网站上工作正常.以下是我用于测试的代码:
public async void downloadFile(string fileUrl, string fileName)
{
var myFolder = await StorageFolder.GetFolderFromPathAsync(Package.Current.InstalledLocation.Path);
var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
var downloader = new BackgroundDownloader();
var downloadOperation = downloader.CreateDownload(new Uri(fileUrl), myFile);
var task = Task.Run(async () => await downloadOperation.StartAsync().AsTask());
if (task.Wait(TimeSpan.FromMilliseconds(1000)))
{
// file is downloaded in time
}
else {
// timeout is reached - how to cancel downloadOperation ?????
downloadOperation.AttachAsync().Cancel();
}
}
Run Code Online (Sandbox Code Playgroud)
通常我们使用CancellationToken来取消下载操作.此外,使用Task.Wait方法将阻止UI线程,这会导致糟糕的用户体验.所以在你的场景中使用CancellationTokenSource.CancelAfter方法可能是更好的选择.
以下是我验证的代码:
public async void downloadFile(string fileUrl, string fileName)
{
var myFolder = await StorageFolder.GetFolderFromPathAsync(Package.Current.InstalledLocation.Path);
var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
var downloader = new BackgroundDownloader();
var downloadOperation = downloader.CreateDownload(new Uri(fileUrl), myFile);
// Define the cancellation token.
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
cts.CancelAfter(1000);
try
{
// Pass the token to the task that listens for cancellation.
await downloadOperation.StartAsync().AsTask(token);
// file is downloaded in time
}
catch (TaskCanceledException)
{
// timeout is reached, downloadOperation is cancled
}
finally
{
// Releases all resources of cts
cts.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |