1

電話からの 1 つ以上のファイルのアップロードをサポートする Windows Phone 8.1 (WinRT) アプリを作成しました。

これにはバックグラウンド アップローダーを使用します。次の関数を使用してバックグラウンドアップロードを作成します

    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);
            }
        }
     }

コールバックに従って進行状況の UI を更新します

    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;
        });
    }

ただし、ファイルがサーバーに正常にアップロードされ、進行状況が 100% であっても、ほとんどの場合、UploadOperation のステータスは「実行中」から「完了」に変わりません。複数のファイルをアップロードすると、ステータスが「完了」と表示されるものと「実行中」と表示されるものがありますが、すべて正常にアップロードされています。

ファイルが完全にアップロードされたことを確認するにはどうすればよいですか?

4

1 に答える 1

0

の通常の完了ハンドラを使用できますIAsyncOperation

すなわち:

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.
}
于 2015-02-04T18:24:32.837 に答える