Bagikan melalui


Transfer latar belakang

Gunakan API transfer latar belakang untuk menyalin file dengan andal melalui jaringan. API transfer latar belakang menyediakan fitur pengunggahan dan pengunduhan lanjutan yang berjalan di latar belakang selama penangguhan aplikasi dan bertahan di luar penghentian aplikasi. API memantau status jaringan dan secara otomatis menangguhkan dan melanjutkan transfer saat konektivitas hilang, dan transfer juga Sadar Akan Data dan Sadar Akan Baterai, yang berarti aktivitas pengunduhan menyesuaikan berdasarkan konektivitas dan status baterai perangkat Anda saat ini. API sangat ideal untuk mengunggah dan mengunduh file besar menggunakan HTTP(S). FTP juga didukung, tetapi hanya untuk unduhan.

Transfer Latar Belakang berjalan secara terpisah dari aplikasi panggilan dan terutama dirancang untuk operasi transfer jangka panjang untuk sumber daya seperti video, musik, dan gambar besar. Untuk skenario ini, menggunakan Transfer Latar Belakang sangat penting karena unduhan terus berlangsung bahkan ketika aplikasi ditangguhkan.

Jika Anda mengunduh sumber daya kecil yang mungkin selesai dengan cepat, Anda harus menggunakan API HttpClient alih-alih Transfer Latar Belakang.

Menggunakan Windows.Networking.BackgroundTransfer

Bagaimana cara kerja fitur Transfer Latar Belakang?

Saat aplikasi menggunakan Transfer Latar Belakang untuk memulai transfer, permintaan dikonfigurasi dan diinisialisasi menggunakan objek kelas BackgroundDownloader atau BackgroundUploader. Setiap operasi transfer ditangani secara individual oleh sistem dan terpisah dari aplikasi panggilan. Informasi kemajuan tersedia jika Anda ingin memberikan status kepada pengguna di UI aplikasi Anda, dan aplikasi Anda dapat menjeda, melanjutkan, membatalkan, atau bahkan membaca dari data saat transfer terjadi. Cara transfer ditangani oleh sistem mempromosikan penggunaan daya pintar dan mencegah masalah yang dapat muncul ketika aplikasi yang terhubung mengalami peristiwa seperti penangguhan aplikasi, penghentian, atau perubahan status jaringan tiba-tiba.

Catatan

Karena batasan sumber daya per aplikasi, aplikasi tidak boleh memiliki lebih dari 200 transfer (DownloadOperations + UploadOperations) pada waktu tertentu. Melebihi batas tersebut dapat membuat antrean transfer aplikasi dalam keadaan tidak dapat dipulihkan.

Ketika aplikasi diluncurkan, aplikasi harus memanggil AttachAsync pada semua objek DownloadOperation dan UploadOperation yang ada. Tidak melakukan ini akan menyebabkan kebocoran transfer yang sudah selesai dan pada akhirnya akan merender penggunaan fitur Transfer Latar Belakang anda tidak berguna.

Melakukan permintaan file terautentikasi dengan Transfer Latar Belakang

Transfer Latar Belakang menyediakan metode yang mendukung server dasar dan kredensial proksi, cookie, dan penggunaan header HTTP kustom (melalui SetRequestHeader) untuk setiap operasi transfer.

Bagaimana fitur ini beradaptasi dengan perubahan status jaringan atau pematian tak terduga?

Fitur Transfer Latar Belakang mempertahankan pengalaman yang konsisten untuk setiap operasi transfer ketika perubahan status jaringan terjadi, dengan secara cerdas memanfaatkan informasi status konektivitas dan paket data operator yang disediakan oleh fitur Koneksi ivity. Untuk menentukan perilaku untuk skenario jaringan yang berbeda, aplikasi menetapkan kebijakan biaya untuk setiap operasi menggunakan nilai yang ditentukan oleh BackgroundTransferCostPolicy.

Misalnya, kebijakan biaya yang ditentukan untuk operasi dapat menunjukkan bahwa operasi harus dijeda secara otomatis saat perangkat menggunakan jaringan terukur. Transfer kemudian secara otomatis dilanjutkan (atau dimulai ulang) ketika koneksi ke jaringan "tidak terbatas" telah dibuat. Untuk informasi selengkapnya tentang bagaimana jaringan ditentukan oleh biaya, lihat NetworkCostType.

Meskipun fitur Transfer Latar Belakang memiliki mekanisme sendiri untuk menangani perubahan status jaringan, ada pertimbangan konektivitas umum lainnya untuk aplikasi yang terhubung dengan jaringan. Baca Memanfaatkan informasi koneksi jaringan yang tersedia untuk info tambahan.

Catatan Untuk aplikasi yang berjalan di perangkat seluler, ada fitur yang memungkinkan pengguna untuk memantau dan membatasi jumlah data yang ditransfer berdasarkan jenis koneksi, status roaming, dan paket data pengguna. Karena itu, transfer latar belakang dapat dijeda di telepon bahkan ketika BackgroundTransferCostPolicy menunjukkan bahwa transfer harus dilanjutkan.

Tabel berikut menunjukkan kapan transfer latar belakang diizinkan di ponsel untuk setiap nilai BackgroundTransferCostPolicy , mengingat status telepon saat ini. Anda dapat menggunakan kelas Koneksi ionCost untuk menentukan status ponsel saat ini.

Kondisi perangkat UnrestrictedOnly Default Selalu
Koneksi ke WiFi Bolehkan Bolehkan Bolehkan
Koneksi terukur, bukan roaming, di bawah batas data, di jalur untuk tetap di bawah batas Tolak Bolehkan Bolehkan
Koneksi terukur, bukan roaming, di bawah batas data, di jalur untuk melebihi batas Tolak Tolak Izinkan
Koneksi terukur, roaming, di bawah batas data Tolak Tolak Izinkan
Koneksi terukur, melebihi batas data. Status ini hanya terjadi ketika pengguna mengaktifkan "Batasi data latar belakang di UI Data Sense. Tolak Tolak Tolak

Mengunggah file

Saat menggunakan Transfer Latar Belakang, unggahan ada sebagai UploadOperation yang mengekspos sejumlah metode kontrol yang digunakan untuk memulai ulang atau membatalkan operasi. Peristiwa aplikasi (misalnya, penangguhan atau penghentian) dan perubahan konektivitas ditangani secara otomatis oleh sistem per UploadOperation; unggahan akan berlanjut selama periode penangguhan aplikasi atau menjeda dan bertahan di luar penghentian aplikasi. Selain itu, mengatur properti CostPolicy akan menunjukkan apakah aplikasi Anda akan mulai mengunggah saat jaringan terukur digunakan untuk konektivitas Internet atau tidak.

Contoh berikut akan memandu Anda melalui pembuatan dan inisialisasi unggahan dasar dan cara menghitung dan memperkenalkan kembali operasi yang bertahan dari sesi aplikasi sebelumnya.

Mengunggah satu file

Pembuatan unggahan dimulai dengan BackgroundUploader. Kelas ini digunakan untuk menyediakan metode yang memungkinkan aplikasi Anda mengonfigurasi unggahan sebelum membuat UploadOperation yang dihasilkan. Contoh berikut menunjukkan cara melakukan ini dengan objek Uri dan StorageFile yang diperlukan.

Mengidentifikasi file dan tujuan untuk unggahan

Sebelum kita dapat memulai dengan pembuatan UploadOperation, pertama-tama kita perlu mengidentifikasi URI lokasi yang akan diunggah, dan file yang akan diunggah. Dalam contoh berikut, nilai uriString diisi menggunakan string dari input UI, dan nilai file menggunakan objek StorageFile yang dikembalikan oleh operasi PickSingleFileAsync.

function uploadFile() {
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
    filePicker.fileTypeFilter.replaceAll(["*"]);

    filePicker.pickSingleFileAsync().then(function (file) {
        if (!file) {
            printLog("No file selected");
            return;
        }

        var upload = new UploadOp();
        var uriString = document.getElementById("serverAddressField").value;
        upload.start(uriString, file);

        // Store the upload operation in the uploadOps array.
        uploadOperations.push(upload);
    });
}

Membuat dan menginisialisasi operasi unggahan

Pada langkah sebelumnya, nilai uriString dan file diteruskan ke instans contoh kami berikutnya, UploadOp, tempat nilai tersebut digunakan untuk mengonfigurasi dan memulai operasi pengunggahan baru. Pertama, uriString diurai untuk membuat objek Uri yang diperlukan.

Selanjutnya, properti StorageFile (file) yang disediakan digunakan oleh BackgroundUploader untuk mengisi header permintaan dan mengatur properti SourceFile dengan objek StorageFile. Metode SetRequestHeader kemudian dipanggil untuk menyisipkan nama file, disediakan sebagai string, dan properti StorageFile.Name.

Terakhir, BackgroundUploader membuat UploadOperation (unggah).

function UploadOp() {
    var upload = null;
    var promise = null;

    this.start = function (uriString, file) {
        try {
        
            var uri = new Windows.Foundation.Uri(uriString);
            var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();

            // Set a header, so the server can save the file (this is specific to the sample server).
            uploader.setRequestHeader("Filename", file.name);

            // Create a new upload operation.
            upload = uploader.createUpload(uri, file);

            // Start the upload and persist the promise to be able to cancel the upload.
            promise = upload.startAsync().then(complete, error, progress);
        } catch (err) {
            displayError(err);
        }
    };
    // On application activation, reassign callbacks for a upload
    // operation persisted from previous application state.
    this.load = function (loadedUpload) {
        try {
            upload = loadedUpload;
            promise = upload.attachAsync().then(complete, error, progress);
        } catch (err) {
            displayError(err);
        }
    };
}

Perhatikan panggilan metode asinkron yang ditentukan menggunakan janji JavaScript. Melihat baris dari contoh terakhir:

promise = upload.startAsync().then(complete, error, progress);

Panggilan metode asinkron diikuti oleh then pernyataan yang menunjukkan metode, yang ditentukan oleh aplikasi, yang dipanggil ketika hasil dari panggilan metode asinkron dikembalikan. Untuk informasi selengkapnya tentang pola pemrograman ini, lihat Pemrograman asinkron di JavaScript menggunakan janji.

Mengunggah beberapa file

Mengidentifikasi file dan tujuan untuk unggahan

Dalam skenario yang melibatkan beberapa file yang ditransfer dengan satu UploadOperation, proses dimulai seperti biasanya dengan terlebih dahulu memberikan URI tujuan yang diperlukan dan informasi file lokal. Mirip dengan contoh di bagian sebelumnya, URI disediakan sebagai string oleh pengguna akhir dan FileOpenPicker dapat digunakan untuk memberikan kemampuan untuk menunjukkan file melalui antarmuka pengguna juga. Namun, dalam skenario ini aplikasi harus memanggil metode PickMultipleFilesAsync untuk mengaktifkan pemilihan beberapa file melalui UI.

function uploadFiles() {
       var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
       filePicker.fileTypeFilter.replaceAll(["*"]);

       filePicker.pickMultipleFilesAsync().then(function (files) {
          if (files === 0) {
             printLog("No file selected");
                return;
          }

          var upload = new UploadOperation();
          var uriString = document.getElementById("serverAddressField").value;
          upload.startMultipart(uriString, files);

          // Persist the upload operation in the global array.
          uploadOperations.push(upload);
       });
    }

Membuat objek untuk parameter yang disediakan

Dua contoh berikutnya menggunakan kode yang terkandung dalam satu metode contoh, startMultipart, yang dipanggil di akhir langkah terakhir. Untuk tujuan instruksi kode dalam metode yang membuat array objek BackgroundTransferContentPart telah dibagi dari kode yang membuat UploadOperation yang dihasilkan.

Pertama, string URI yang disediakan oleh pengguna diinisialisasi sebagai Uri. Selanjutnya, array objek IStorageFile (file) yang diteruskan ke metode ini diulang, setiap objek digunakan untuk membuat objek BackgroundTransferContentPart baru yang kemudian ditempatkan di array contentParts.

    upload.startMultipart = function (uriString, files) {
        try {
            var uri = new Windows.Foundation.Uri(uriString);
            var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();

            var contentParts = [];
            files.forEach(function (file, index) {
                var part = new Windows.Networking.BackgroundTransfer.BackgroundTransferContentPart("File" + index, file.name);
                part.setFile(file);
                contentParts.push(part);
            });

Membuat dan menginisialisasi operasi unggahan multi-bagian

Dengan array contentParts kami yang diisi dengan semua objek BackgroundTransferContentPart yang mewakili setiap IStorageFile untuk diunggah, kami siap untuk memanggil CreateUploadAsync menggunakan Uri untuk menunjukkan di mana permintaan akan dikirim.

        // Create a new upload operation.
            uploader.createUploadAsync(uri, contentParts).then(function (uploadOperation) {

               // Start the upload and persist the promise to be able to cancel the upload.
               upload = uploadOperation;
               promise = uploadOperation.startAsync().then(complete, error, progress);
            });

         } catch (err) {
             displayError(err);
         }
     };

Memulai ulang operasi pengunggahan yang terganggu

Setelah penyelesaian atau pembatalan UploadOperation, sumber daya sistem terkait dirilis. Namun, jika aplikasi Anda dihentikan sebelum salah satu hal ini dapat terjadi, operasi aktif apa pun dijeda dan sumber daya yang terkait dengan masing-masing tetap ditempati. Jika operasi ini tidak dijumlahkan dan diperkenalkan kembali ke sesi aplikasi berikutnya, operasi tersebut tidak akan selesai dan akan terus menempati sumber daya perangkat.

  1. Sebelum menentukan fungsi yang menghitung operasi yang bertahan, kita perlu membuat array yang akan berisi objek UploadOperation yang akan dikembalikan:

    var uploadOperations = [];
    
  2. Selanjutnya kita menentukan fungsi yang menghitung operasi yang bertahan dan menyimpannya dalam array kita. Perhatikan bahwa metode pemuatan yang dipanggil untuk menetapkan kembali panggilan balik ke UploadOperation, jika tetap ada melalui penghentian aplikasi, ada di kelas UploadOp yang kami tentukan nanti di bagian ini.

    function Windows.Networking.BackgroundTransfer.BackgroundUploader.getCurrentUploadsAsync() {
        .then(function (uploads) {
            for (var i = 0; i < uploads.size; i++) {
                var upload = new UploadOp();
                upload.load(uploads[i]);
                uploadOperations.push(upload);
            }
        }
    };
    

Mengunduh file

Saat menggunakan Transfer Latar Belakang, setiap unduhan ada sebagai DownloadOperation yang mengekspos sejumlah metode kontrol yang digunakan untuk menjeda, melanjutkan, memulai ulang, dan membatalkan operasi. Peristiwa aplikasi (misalnya, penangguhan atau penghentian) dan perubahan konektivitas ditangani secara otomatis oleh sistem per DownloadOperation; unduhan akan berlanjut selama periode penangguhan aplikasi atau menjeda dan bertahan di luar penghentian aplikasi. Untuk skenario jaringan seluler, mengatur properti CostPolicy akan menunjukkan apakah aplikasi Anda akan memulai atau melanjutkan unduhan saat jaringan terukur digunakan untuk konektivitas Internet atau tidak.

Jika Anda mengunduh sumber daya kecil yang mungkin selesai dengan cepat, Anda harus menggunakan API HttpClient alih-alih Transfer Latar Belakang.

Contoh berikut akan memandu Anda melalui pembuatan dan inisialisasi unduhan dasar, dan cara menghitung dan memperkenalkan kembali operasi yang bertahan dari sesi aplikasi sebelumnya.

Mengonfigurasi dan memulai unduhan file Transfer Latar Belakang

Contoh berikut menunjukkan bagaimana string yang mewakili URI dan nama file dapat digunakan untuk membuat objek Uri dan StorageFile yang akan berisi file yang diminta. Dalam contoh ini, file baru secara otomatis ditempatkan di lokasi yang telah ditentukan sebelumnya. Atau, FileSavePicker dapat digunakan memungkinkan pengguna untuk menunjukkan tempat menyimpan file di perangkat. Perhatikan bahwa metode pemuatan yang dipanggil untuk menetapkan kembali panggilan balik ke DownloadOperation, jika tetap ada melalui penghentian aplikasi, ada di kelas DownloadOp yang ditentukan nanti di bagian ini.

function DownloadOp() {
    var download = null;
    var promise = null;
    var imageStream = null;

    this.start = function (uriString, fileName) {
        try {
            // Asynchronously create the file in the pictures folder.
            Windows.Storage.KnownFolders.picturesLibrary.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).done(function (newFile) {
                var uri = Windows.Foundation.Uri(uriString);
                var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();

                // Create a new download operation.
                download = downloader.createDownload(uri, newFile);

                // Start the download and persist the promise to be able to cancel the download.
                promise = download.startAsync().then(complete, error, progress);
            }, error);
        } catch (err) {
            displayException(err);
        }
    };
    // On application activation, reassign callbacks for a download
    // operation persisted from previous application state.
    this.load = function (loadedDownload) {
        try {
            download = loadedDownload;
            printLog("Found download: " + download.guid + " from previous application run.<br\>");
            promise = download.attachAsync().then(complete, error, progress);
        } catch (err) {
            displayException(err);
        }
    };
}

Perhatikan panggilan metode asinkron yang ditentukan menggunakan janji JavaScript. Melihat baris 17 dari contoh kode sebelumnya:

promise = download.startAsync().then(complete, error, progress);

Panggilan metode asinkron diikuti oleh pernyataan kemudian yang menunjukkan metode, yang ditentukan oleh aplikasi, yang dipanggil ketika hasil dari panggilan metode asinkron dikembalikan. Untuk informasi selengkapnya tentang pola pemrograman ini, lihat Pemrograman asinkron di JavaScript menggunakan janji.

Menambahkan metode kontrol operasi tambahan

Tingkat kontrol dapat ditingkatkan dengan menerapkan metode DownloadOperation tambahan. Misalnya, menambahkan kode berikut ke contoh di atas akan memperkenalkan kemampuan untuk membatalkan unduhan.

// Cancel download.
this.cancel = function () {
    try {
        if (promise) {
            promise.cancel();
            promise = null;
            printLog("Canceling download: " + download.guid + "<br\>");
            if (imageStream) {
                imageStream.close();
            }
        }
        else {
            printLog("Download " + download.guid + " already canceled.<br\>");
        }
    } catch (err) {
        displayException(err);
    }
};

Menghitung operasi yang bertahan saat start-up

Setelah penyelesaian atau pembatalan DownloadOperation, sumber daya sistem terkait dirilis. Namun, jika aplikasi Anda dihentikan sebelum salah satu peristiwa ini terjadi, unduhan akan dijeda dan bertahan di latar belakang. Contoh berikut menunjukkan cara memperkenalkan kembali unduhan yang dipertahankan ke dalam sesi aplikasi baru.

  1. Sebelum menentukan fungsi yang menghitung operasi yang bertahan, kita perlu membuat array yang akan berisi objek DownloadOperation yang akan dikembalikan:

    var downloadOps = [];
    
  2. Selanjutnya kita menentukan fungsi yang menghitung operasi yang bertahan dan menyimpannya dalam array kita. Perhatikan bahwa metode pemuatan yang dipanggil untuk menetapkan kembali panggilan balik untuk DownloadOperation yang bertahan ada dalam contoh DownloadOp yang kami tentukan nanti di bagian ini.

    // Enumerate outstanding downloads.
    Windows.Networking.BackgroundTransfer.BackgroundDownloader.getCurrentDownloadsAsync().done(function (downloads) {
    
        for (var i = 0; i < downloads.size; i++) {
            var download = new DownloadOp();
            download.load(downloads[i]);
            downloadOps.push(download);
        }
    });
    
  3. Anda sekarang dapat menggunakan daftar yang diisi untuk memulai ulang operasi yang tertunda.

Pasca-pemrosesan

Fitur baru di Windows 10 adalah kemampuan untuk menjalankan kode aplikasi pada penyelesaian transfer latar belakang bahkan ketika aplikasi tidak berjalan. Misalnya, aplikasi Anda mungkin ingin memperbarui daftar film yang tersedia setelah film selesai diunduh, daripada meminta aplikasi Anda memindai film baru setiap kali dimulai. Atau aplikasi Anda mungkin ingin menangani transfer file yang gagal dengan mencoba lagi menggunakan server atau port yang berbeda. Pasca-pemrosesan dipanggil untuk transfer yang berhasil dan gagal, sehingga Anda dapat menggunakannya untuk menerapkan logika penanganan kesalahan dan coba lagi kustom.

Pascaproscessing menggunakan infrastruktur tugas latar belakang yang ada. Anda membuat tugas latar belakang dan mengaitkannya dengan transfer Anda sebelum memulai transfer. Transfer kemudian dijalankan di latar belakang, dan ketika selesai, tugas latar belakang Anda dipanggil untuk melakukan pasca-pemrosesan.

Pasca-pemrosesan menggunakan kelas baru, BackgroundTransferCompletionGroup. Kelas ini mirip dengan BackgroundTransferGroup yang ada karena memungkinkan Anda mengelompokkan transfer latar belakang bersama-sama, tetapi BackgroundTransferCompletionGroup menambahkan kemampuan untuk menunjuk tugas latar belakang yang akan dijalankan ketika transfer selesai.

Anda memulai transfer latar belakang dengan pasca-pemrosesan sebagai berikut.

  1. Buat objek BackgroundTransferCompletionGroup. Kemudian, buat objek BackgroundTaskBuilder. Atur properti Pemicu objek penyusun ke objek grup penyelesaian, dan properti TaskEntryPoint dari penyusun ke titik masuk tugas latar belakang yang harus dijalankan pada penyelesaian transfer. Terakhir, panggil metode BackgroundTaskBuilder.Register untuk mendaftarkan tugas latar belakang Anda. Perhatikan bahwa banyak grup penyelesaian dapat berbagi satu titik entri tugas latar belakang, tetapi Anda hanya dapat memiliki satu grup penyelesaian per pendaftaran tugas latar belakang.
var completionGroup = new BackgroundTransferCompletionGroup();
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();

builder.Name = "MyDownloadProcessingTask";
builder.SetTrigger(completionGroup.Trigger);
builder.TaskEntryPoint = "Tasks.BackgroundDownloadProcessingTask";

BackgroundTaskRegistration downloadProcessingTask = builder.Register();
  1. Selanjutnya Anda mengaitkan transfer latar belakang dengan grup penyelesaian. Setelah semua transfer dibuat, aktifkan grup penyelesaian.
BackgroundDownloader downloader = new BackgroundDownloader(completionGroup);
DownloadOperation download = downloader.CreateDownload(uri, file);
Task<DownloadOperation> startTask = download.StartAsync().AsTask();

// App still sees the normal completion path
startTask.ContinueWith(ForegroundCompletionHandler);

// Do not enable the CompletionGroup until after all downloads are created.
downloader.CompletionGroup.Enable();
  1. Kode dalam tugas latar belakang mengekstrak daftar operasi dari detail pemicu, dan kode Anda kemudian dapat memeriksa detail untuk setiap operasi dan melakukan pasca-pemrosesan yang sesuai untuk setiap operasi.
public class BackgroundDownloadProcessingTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
    var details = (BackgroundTransferCompletionGroupTriggerDetails)taskInstance.TriggerDetails;
    IReadOnlyList<DownloadOperation> downloads = details.Downloads;

    // Do post-processing on each finished operation in the list of downloads
    }
}

Tugas pasca-pemrosesan adalah tugas latar belakang reguler. Ini adalah bagian dari kumpulan semua tugas latar belakang, dan tunduk pada kebijakan manajemen sumber daya yang sama dengan semua tugas latar belakang.

Perhatikan juga bahwa pasca-pemrosesan tidak menggantikan penangan penyelesaian latar depan. Jika aplikasi Anda menentukan handler penyelesaian latar depan, dan aplikasi Anda berjalan saat transfer file selesai, maka handler penyelesaian latar depan dan handler penyelesaian latar belakang Anda akan dipanggil. Urutan di mana tugas latar depan dan latar belakang dipanggil tidak dijamin. Jika Anda menentukan keduanya, Anda harus memastikan bahwa kedua tugas akan berfungsi dengan baik dan tidak mengganggu satu sama lain jika berjalan bersamaan.

Batas waktu permintaan

Ada dua skenario batas waktu koneksi utama untuk dipertimbangkan:

  • Saat membuat koneksi baru untuk transfer, permintaan koneksi dibatalkan jika tidak dibuat dalam waktu lima menit.

  • Setelah koneksi dibuat, pesan permintaan HTTP yang belum menerima respons dalam waktu dua menit dibatalkan.

Catatan Dalam kedua skenario, dengan asumsi ada konektivitas Internet, Transfer Latar Belakang akan mencoba kembali permintaan hingga tiga kali secara otomatis. Jika konektivitas Internet tidak terdeteksi, permintaan tambahan akan menunggu hingga terdeteksi.

Panduan penelusuran kesalahan

Menghentikan sesi penelusuran kesalahan di Microsoft Visual Studio sebanding dengan menutup aplikasi Anda; Unggahan PUT dijeda dan unggahan POST dihentikan. Bahkan saat penelusuran kesalahan, aplikasi Anda harus menghitung lalu memulai ulang atau membatalkan unggahan yang bertahan. Misalnya, Anda dapat meminta aplikasi membatalkan operasi pengunggahan yang dijumlahkan di startup aplikasi jika tidak ada minat dalam operasi sebelumnya untuk sesi debug tersebut.

Saat menghitung unduhan/unggahan pada startup aplikasi selama sesi debug, Anda dapat meminta aplikasi membatalkannya jika tidak ada minat dalam operasi sebelumnya untuk sesi debug tersebut. Perhatikan bahwa jika ada pembaruan proyek Visual Studio, seperti perubahan pada manifes aplikasi, dan aplikasi dihapus instalasinya dan disebarkan kembali, GetCurrentUploadsAsync tidak dapat menghitung operasi yang dibuat menggunakan penyebaran aplikasi sebelumnya.

Saat menggunakan Transfer Latar Belakang selama pengembangan, Anda mungkin mengalami situasi di mana cache internal operasi transfer aktif dan selesai dapat tidak sinkron. Ini dapat mengakibatkan ketidakmampuan untuk memulai operasi transfer baru atau berinteraksi dengan operasi yang ada dan objek BackgroundTransferGroup. Dalam beberapa kasus, mencoba berinteraksi dengan operasi yang ada dapat memicu crash. Hasil ini dapat terjadi jika properti TransferBehavior diatur ke Paralel. Masalah ini hanya terjadi dalam skenario tertentu selama pengembangan dan tidak berlaku untuk pengguna akhir aplikasi Anda.

Empat skenario menggunakan Visual Studio dapat menyebabkan masalah ini.

  • Anda membuat proyek baru dengan nama aplikasi yang sama dengan proyek yang sudah ada, tetapi bahasa yang berbeda (dari C++ ke C#, misalnya).
  • Anda mengubah arsitektur target (dari x86 ke x64, misalnya) dalam proyek yang ada.
  • Anda mengubah budaya (dari netral ke en-US, misalnya) dalam proyek yang ada.
  • Anda menambahkan atau menghapus kemampuan dalam manifes paket (menambahkan Autentikasi Perusahaan, misalnya) dalam proyek yang sudah ada.

Layanan aplikasi reguler, termasuk pembaruan manifes yang menambahkan atau menghapus kemampuan, tidak memicu masalah ini pada penyebaran pengguna akhir aplikasi Anda. Untuk mengatasi masalah ini, hapus semua versi aplikasi sepenuhnya dan sebarkan ulang dengan bahasa, arsitektur, budaya, atau kemampuan baru. Ini dapat dilakukan melalui layar Mulai atau menggunakan PowerShell dan cmdlet Remove-AppxPackage .

Pengecualian di Windows.Networking.BackgroundTransfer

Pengecualian dilemparkan ketika string yang tidak valid untuk Pengidentifikasi Sumber Daya Seragam (URI) diteruskan ke konstruktor untuk objek Windows.Foundation.Uri.

.NET: Jenis Windows.Foundation.Uri muncul sebagai System.Uri di C# dan VB.

Di C# dan Visual Basic, kesalahan ini dapat dihindari dengan menggunakan kelas System.Uri di .NET 4.5 dan salah satu metode System.Uri.TryCreate untuk menguji string yang diterima dari pengguna aplikasi sebelum URI dibangun.

Di C++, tidak ada metode untuk mencoba dan mengurai string ke URI. Jika aplikasi mendapatkan input dari pengguna untuk Windows.Foundation.Uri, konstruktor harus berada di blok coba/tangkap. Jika pengecualian dilemparkan, aplikasi dapat memberi tahu pengguna dan meminta nama host baru.

Namespace layanan Windows.Networking.backgroundTransfer memiliki metode pembantu yang nyaman dan menggunakan enumerasi di namespace Layanan Windows.Networking.Sockets untuk menangani kesalahan. Ini dapat berguna untuk menangani pengecualian jaringan tertentu secara berbeda di aplikasi Anda.

Kesalahan yang ditemui pada metode asinkron di namespace layanan Windows.Networking.backgroundTransfer dikembalikan sebagai nilai HRESULT. Metode BackgroundTransferError.GetStatus digunakan untuk mengonversi kesalahan jaringan dari operasi transfer latar belakang ke nilai enumerasi WebErrorStatus. Sebagian besar nilai enumerasi WebErrorStatus sesuai dengan kesalahan yang dikembalikan oleh operasi klien HTTP atau FTP asli. Aplikasi dapat memfilter nilai enumerasi WebErrorStatus tertentu untuk memodifikasi perilaku aplikasi tergantung pada penyebab pengecualian.

Untuk kesalahan validasi parameter, aplikasi juga dapat menggunakan HRESULT dari pengecualian untuk mempelajari informasi lebih rinci tentang kesalahan yang menyebabkan pengecualian. Nilai HRESULT yang mungkin tercantum dalam file header Winerror.h. Untuk sebagian besar kesalahan validasi parameter, HRESULT yang dikembalikan E_INVALIDARG.

API penting