Windows runtime 后台传输状态未更改为已完成
我创建了一个Windows Phone 8.1(WinRT)应用程序,支持从手机上载一个或多个文件 我使用后台上传程序来实现这一点。我使用以下函数创建后台上传Windows runtime 后台传输状态未更改为已完成,windows-runtime,windows-phone-8.1,win-universal-app,background-transfer,Windows Runtime,Windows Phone 8.1,Win Universal App,Background Transfer,我创建了一个Windows Phone 8.1(WinRT)应用程序,支持从手机上载一个或多个文件 我使用后台上传程序来实现这一点。我使用以下函数创建后台上传 public async void AddUploads(IReadOnlyList<StorageFile> uploadFiles) { BackgroundTransferGroup group = BackgroundTransferGroup.CreateGroup(this.Grou
public async void AddUploads(IReadOnlyList<StorageFile> uploadFiles)
{
BackgroundTransferGroup group = BackgroundTransferGroup.CreateGroup(this.GroupId);
group.TransferBehavior = BackgroundTransferBehavior.Serialized;
// BackgroundUploader automatically sets Content-Type header to multipart/related
BackgroundUploader uploader = new BackgroundUploader();
uploader.TransferGroup = group;
uploader.SetRequestHeader("Authorization", "Bearer " + this.AccessToken);
uploader.Method = "POST";
foreach (StorageFile file in uploadFiles)
{
UploadOperation upload = await uploader.CreateUploadAsync(new Uri(this.uploadUri, UriKind.Absolute), GetTransferContents(file), "related");
Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgressNotification);
// Will this exception be caught??
try
{
upload.StartAsync().AsTask(this.CancelToken, progressCallback);
}
}
}
但是,大多数情况下,即使文件已成功上载到服务器且进度为100%,上载操作的状态也不会从“正在运行”更改为“已完成”。当我上传多个文件时,其中一些文件显示“已完成”状态,而另一些文件显示“正在运行”,但所有文件都已成功上传
如何确定文件何时完全上载?您可以使用
IAsyncOperation
的常规完成处理程序
i、 e:
private异步void Foo()
{
// ...
var task=upload.StartAsync().AsTask(this.CancelToken,progressCallback);
var notawayed=task.ContinueWith(OnUploadCompleted,upload);
}
私有void OnUploadCompleted(任务,对象arg)
{
//此时已完成上载。
//检查task.Status以查看上载是否成功。
}
看一看,我不确定,但也许那里的答案会有所帮助。
public void UploadProgressNotification(UploadOperation upload)
{
var ignore = Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
var uploadProgress = upload.Progress;
Progress = (uploadProgress.BytesSent + uploadProgress.BytesReceived) * 100.0 / (uploadProgress.TotalBytesToSend + uploadProgress.TotalBytesToReceive);
switch(uploadProgress.Status)
{
case BackgroundTransferStatus.Canceled:
Status = "Canceled";
break;
case BackgroundTransferStatus.Idle:
Status = "Waiting";
break;
case BackgroundTransferStatus.PausedNoNetwork:
Status = "Waiting for network";
break;
case BackgroundTransferStatus.Running:
Status = "Uploading";
break;
case BackgroundTransferStatus.Error:
Status = "Failed";
System.Diagnostics.Debug.WriteLine(upload.GetResponseInformation().StatusCode);
var headers = upload.GetResponseInformation().Headers;
foreach(string key in headers.Keys)
{
System.Diagnostics.Debug.WriteLine(headers[key]);
}
System.Diagnostics.Debug.WriteLine(upload.GetResponseInformation().IsResumable);
break;
case BackgroundTransferStatus.Completed:
Status = "Completed";
break;
default:
Status = "Waiting";
break;
}
UploadStatus = uploadProgress.Status;
});
}
private async void Foo()
{
// ...
var task = upload.StartAsync().AsTask(this.CancelToken, progressCallback);
var notAwaited = task.ContinueWith(OnUploadCompleted, upload);
}
private void OnUploadCompleted(Task<DownloadOperation> task, object arg)
{
// Upload is complete at this point.
// Check task.Status to see if the upload was successful or not.
}