Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí rozhraní API pro přenos na pozadí můžete spolehlivě kopírovat soubory přes síť. Rozhraní API pro přenos na pozadí poskytuje pokročilé funkce pro nahrávání a stahování, které běží na pozadí během pozastavení aplikace a zachovají se nad rámec ukončení aplikace. Rozhraní API monitoruje stav sítě a automaticky pozastaví a obnoví přenosy, když dojde ke ztrátě připojení. Přenosy také využívají funkce Data Sense a Battery Sense, což znamená, že aktivita stahování se upravuje na základě aktuálního připojení a stavu baterie zařízení. Rozhraní API je ideální pro nahrávání a stahování velkých souborů pomocí HTTP(S). Protokol FTP je také podporovaný, ale jenom pro stahování.
Note
Rozhraní Windows.Networking.BackgroundTransfer API jsou rozhraní API systému prostředí Windows Runtime (WinRT), která fungují jak v desktopových aplikacích WinUI 3 (Windows App SDK), tak v aplikacích UWP. Přenosy na pozadí vyžadují identitu balíčku; Rozbalené aplikace nemůžou toto rozhraní API používat.
Přenos na pozadí běží odděleně od volající aplikace a je primárně určený pro dlouhodobé přenosové operace pro prostředky, jako jsou video, hudba a velké obrázky. Pro tyto scénáře je použití funkce Převod na pozadí nezbytné, protože stahování pokračuje i v případě, že je aplikace pozastavená.
Pokud stahujete malé zdroje, jejichž stahování bude pravděpodobně rychle dokončeno, měli byste místo Přenosu na pozadí použít rozhraní API HttpClient.
Použití Windows.Networking.BackgroundTransfer
Jak funguje funkce Přenos na pozadí?
Pokud aplikace používá přenosy na pozadí k zahájení přenosu, požadavek se konfiguruje a inicializuje pomocí objektů tříd BackgroundDownloader nebo BackgroundUploader. Každá operace přenosu se zpracovává zvlášť systémem a je oddělená od volající aplikace. Informace o průběhu jsou k dispozici, pokud chcete uživateli udělit stav v uživatelském rozhraní aplikace a vaše aplikace může během přenosu pozastavit, obnovit, zrušit nebo dokonce číst data. Způsob zpracování přenosů systémem podporuje inteligentní využití energie a zabraňuje problémům, ke kterým může dojít, když připojená aplikace narazí na události, jako je pozastavení aplikace, ukončení nebo náhlé změny stavu sítě.
Note
Vzhledem k omezením prostředků jednotlivých aplikací by aplikace neměla mít v daném okamžiku více než 200 přenosů (DownloadOperations + UploadOperations). Překročení tohoto limitu může zanechat frontu přenosů aplikace ve stavu, ze kterého ji nebude možné obnovit.
Při spuštění aplikace musí volat AttachAsync u všech existujících objektů DownloadOperation a UploadOperation . Pokud to neuděláte, povede to k úniku prostředků u již dokončených přenosů a používání funkce Přenos na pozadí bude nakonec k ničemu.
Provádění autentizovaných požadavků na soubory pomocí Background Transfer
Přenos na pozadí poskytuje metody, které podporují základní přihlašovací údaje serveru a proxy serveru, soubory cookie a použití vlastních hlaviček HTTP (prostřednictvím SetRequestHeader) pro každou operaci přenosu.
Jak se tato funkce přizpůsobuje změnám stavu sítě nebo neočekávaným vypnutím?
Funkce Přenos na pozadí udržuje konzistentní prostředí pro každou operaci přenosu, když dojde ke změnám stavu sítě, a to inteligentním využitím informací o stavu připojení a datového plánu operátora, které poskytuje funkce Připojení . Pokud chcete definovat chování pro různé síťové scénáře, aplikace nastaví zásadu nákladů pro každou operaci pomocí hodnot definovaných backgroundTransferCostPolicy.
Například zásada nákladů definovaná pro operaci může znamenat, že by se operace měla pozastavit automaticky, když zařízení používá síť s měřením dat. Přenos se pak automaticky obnoví (nebo restartuje), když se naváže připojení k "neomezené" síti. Další informace o tom, jak jsou sítě definovány podle nákladů, naleznete v tématu NetworkCostType.
I když má funkce Přenos na pozadí vlastní mechanismy pro zpracování změn stavu sítě, existují další obecné aspekty připojení pro aplikace připojené k síti. Použijte rozhraní API Windows.Networking.Connectivity k monitorování stavu připojení a informací o nákladech.
Note
U aplikací spuštěných na mobilních zařízeních existují funkce, které uživateli umožňují monitorovat a omezovat množství přenášených dat na základě typu připojení, stavu roamingu a datového plánu uživatele. Z tohoto důvodu může být přenosy na pozadí pozastaveny na telefonu, i když BackgroundTransferCostPolicy indikuje, že přenos by měl pokračovat.
Následující tabulka udává, kdy jsou na telefonu povoleny přenosy na pozadí pro každou hodnotu BackgroundTransferCostPolicy vzhledem k aktuálnímu stavu telefonu. K určení aktuálního stavu telefonu můžete použít třídu ConnectionCost .
| Stav zařízení | Pouze neomezené | Default | Vždy |
|---|---|---|---|
| Připojeno k Wi-Fi | Povolit | Povolit | Povolit |
| Připojení účtované podle objemu dat, bez roamingu, v rámci datového limitu, na dobré cestě zůstat pod limitem | Deny | Povolit | Povolit |
| Připojení s měřeným přenosem dat, bez roamingu, v rámci datového limitu, směřuje k překročení limitu | Deny | Deny | Povolit |
| Připojení účtované podle měrného využití, roaming v rámci limitu dat | Deny | Deny | Povolit |
| Měřené připojení, překročen datový limit K tomuto stavu dochází pouze v případě, že uživatel povolí omezení dat na pozadí v uživatelském rozhraní inteligentního zpracování dat. | Deny | Deny | Deny |
Nahrávání souborů
Při použití funkce Přenos na pozadí je odesílání reprezentováno jako UploadOperation, které zpřístupňuje několik řídicích metod používaných k restartování nebo zrušení operace. Události aplikace (například pozastavení nebo ukončení) a změny připojení systém automaticky zpracovává prostřednictvím UploadOperation; odesílání bude během pozastavení aplikace pokračovat, nebo se pozastaví a přetrvá i po ukončení aplikace. Kromě toho nastavení vlastnosti CostPolicy bude indikovat, jestli se vaše aplikace začne nahrávat, když se pro připojení k internetu používá síť účtovaná podle měrného metru.
Následující příklady vás provedou vytvořením a inicializací základního odesílání souboru a ukážou vám, jak vypsat a znovu načíst operace uložené z předchozí relace aplikace.
Nahrání jednoho souboru
Vytvoření nahrávání začíná nástrojem BackgroundUploader. Tato třída se používá k poskytování metod, které vaší aplikaci umožňují nakonfigurovat nahrávání před vytvořením výsledné UploadOperation. Následující příklad ukazuje, jak to provést s požadovanými Uri a StorageFile objekty.
Určení souboru a cíle pro nahrání
Než začneme vytvořením funkce UploadOperation, musíme nejprve identifikovat identifikátor URI umístění, do kterého se má nahrát, a soubor, který se nahraje. V následujícím příkladu je hodnota uriString nastavena pomocí řetězce ze vstupu v uživatelském rozhraní a hodnota file pomocí objektu StorageFile vráceného operací 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);
});
}
Vytvoření a inicializace operace nahrávání
V předchozím kroku se hodnoty uriString a souboru předávají instanci našeho dalšího příkladu UploadOp, kde se používají ke konfiguraci a spuštění nové operace nahrávání. Nejprve se uriString parsuje a vytvoří požadovaný objekt Uri .
Dále BackgroundUploader používá vlastnosti zadaného StorageFile (soubor) k vyplnění hlavičky požadavku a k nastavení vlastnosti SourceFile na objekt StorageFile. Poté se zavolá metoda SetRequestHeader, která vloží název souboru zadaný jako řetězec a vlastnost StorageFile.Name.
Nakonec BackgroundUploader vytvoří UploadOperation (upload).
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);
}
};
}
Všimněte si volání asynchronní metody definované pomocí příslibů JavaScriptu. Pohled na řádek z posledního příkladu:
promise = upload.startAsync().then(complete, error, progress);
Za voláním asynchronní metody následuje then příkaz, který označuje metody definované aplikací, které se volají při vrácení výsledku volání asynchronní metody. Další informace o tomto programovacím vzoru naleznete v tématu Asynchronní programování v JavaScriptu pomocí příslibů.
Nahrání více souborů
Identifikace souborů a cíle pro nahrání
Ve scénáři zahrnujícím více souborů přenesených s jednou uploadOperation proces začíná tak, jak to obvykle dělá tím, že nejprve poskytne požadovaný cílový identifikátor URI a informace o místním souboru. Podobně jako v příkladu v předchozí části je identifikátor URI poskytován jako řetězec koncového uživatele a FileOpenPicker lze použít také k poskytnutí možnosti indikovat soubory prostřednictvím uživatelského rozhraní. V tomto scénáři by však aplikace měla místo toho volat PickMultipleFilesAsync metoda, která umožňuje výběr více souborů prostřednictvím uživatelského rozhraní.
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);
});
}
Vytvoření objektů pro zadané parametry
Následující dva příklady používají kód obsažený v jedné ukázkové metodě startMultipart, která byla volána na konci posledního kroku. Pro účely vysvětlení byl kód v metodě, který vytváří pole objektů BackgroundTransferContentPart, oddělen od kódu, který vytváří výsledný objekt UploadOperation.
Nejprve se řetězec identifikátoru URI poskytnutý uživatelem inicializuje jako identifikátor URI. Dále se prochází pole objektů IStorageFile (files) předané této metodě; každý objekt se použije k vytvoření nového objektu BackgroundTransferContentPart, který je pak umístěn do pole 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);
});
Vytvořte a inicializujte operaci vícedílného nahrávání
S naším polem contentParts naplněným všemi objekty BackgroundTransferContentPart představujícími každou IStorageFile pro nahrání jsme připraveni volat CreateUploadAsync pomocí identifikátoru URI , abychom označili, kam se požadavek odešle.
// 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);
}
};
Restartování přerušených operací nahrávání
Po dokončení nebo zrušení UploadOperation se uvolní všechny přidružené systémové prostředky. Pokud se ale vaše aplikace ukončí dříve, než může dojít k některé z těchto věcí, všechny aktivní operace se pozastaví a prostředky přidružené k jednotlivým prostředkům zůstanou obsazené. Pokud tyto operace nejsou uvedeny a znovu zavedeny do další relace aplikace, nebudou dokončeny a budou nadále zabírat prostředky zařízení.
Před definováním funkce, která vytváří výčet trvalých operací, musíme vytvořit pole obsahující objekty UploadOperation , které vrátí:
var uploadOperations = [];Dále definujeme funkci, která vytvoří výčet trvalých operací a uloží je do našeho pole. Všimněte si, že metoda load, která se volá pro opětovné přiřazení zpětných volání k UploadOperation, má-li přetrvat po ukončení aplikace, je definována ve třídě UploadOp, kterou definujeme dále v této části.
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); } } };
Stahování souborů
Při použití funkce Background Transfer je každé stahování reprezentováno jako DownloadOperation, která zpřístupňuje řadu metod pro pozastavení, obnovení, restartování a zrušení operace. Události aplikace (například pozastavení nebo ukončení) a změny připojení systém automaticky zpracovává pro každou instanci DownloadOperation; stahování budou během období pozastavení aplikace pokračovat nebo se pozastaví a přetrvají i po ukončení aplikace. V případě scénářů mobilní sítě bude nastavení vlastnosti CostPolicy indikovat, jestli vaše aplikace začne nebo bude pokračovat ve stahování v době, kdy se pro připojení k internetu používá měřená síť.
Pokud stahujete malé zdroje, jejichž stahování bude pravděpodobně rychle dokončeno, měli byste místo Přenosu na pozadí použít rozhraní API HttpClient.
Následující příklady vám ukážou, jak vytvořit a inicializovat základní stahování a jak vypsat a znovu načíst operace uložené z předchozí relace aplikace.
Nakonfigurujte a spusťte stahování souboru na pozadí
Následující příklad ukazuje, jak řetězce představující identifikátor URI a název souboru lze použít k vytvoření Uri objektu a StorageFile , který bude obsahovat požadovaný soubor. V tomto příkladu se nový soubor automaticky umístí do předem definovaného umístění. Alternativně můžete použít FileSavePicker , který uživatelům umožní určit, kam se má soubor uložit na zařízení. Všimněte si, že metoda load, volaná pro opětovné přiřazení callbacků objektu DownloadOperation, pokud přetrvá po ukončení aplikace, je ve třídě DownloadOp, která je definována dále v této části.
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);
}
};
}
Všimněte si volání asynchronní metody definované pomocí příslibů JavaScriptu. Pohled na řádek 17 z předchozího příkladu kódu:
promise = download.startAsync().then(complete, error, progress);
Za voláním asynchronní metody následuje příkaz, který indikuje metody definované aplikací, které se volají, když se vrátí výsledek volání asynchronní metody. Další informace o tomto programovacím vzoru naleznete v tématu Asynchronní programování v JavaScriptu pomocí příslibů.
Přidání dalších metod řízení operací
Úroveň řízení lze zvýšit implementací dalších metod DownloadOperation . Například přidáním následujícího kódu do výše uvedeného příkladu se zobrazí možnost zrušit stahování.
// 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);
}
};
Výčet trvalých operací při spuštění
Po dokončení nebo zrušení funkce DownloadOperation se uvolní všechny přidružené systémové prostředky. Pokud je však vaše aplikace ukončena dříve, než dojde k některé z těchto událostí, stahování se pozastaví a zůstanou pozastavená na pozadí. Následující příklady ukazují, jak znovu zavést trvalé stahování do nové relace aplikace.
Před definováním funkce, která vytváří výčet trvalých operací, musíme vytvořit pole, které bude obsahovat objekty DownloadOperation , které vrátí:
var downloadOps = [];Dále definujeme funkci, která vytvoří výčet trvalých operací a uloží je do našeho pole. Všimněte si, že metoda load, volaná pro opětovné přiřazení zpětných volání k persistované operaci DownloadOperation, je definována v příkladu DownloadOp, který uvádíme dále v této části.
// 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); } });Teď můžete pomocí vyplněného seznamu restartovat čekající operace.
Následné zpracování
Nová funkce v Windows 10 je schopnost spouštět kód aplikace při dokončování přenosu na pozadí i v případě, že aplikace není spuštěná. Vaše aplikace může například chtít aktualizovat seznam dostupných filmů po dokončení stahování videa, místo aby aplikace při každém spuštění vyhledála nové filmy. Nebo vaše aplikace může chtít zpracovat neúspěšný přenos souborů tím, že se pokusíte znovu použít jiný server nebo port. Následné zpracování se vyvolá pro úspěšné i neúspěšné přenosy, takže ho můžete použít k implementaci vlastní logiky zpracování chyb a opakování.
Postprocessing používá existující infrastrukturu úloh na pozadí. Před zahájením přenosů vytvoříte úlohu na pozadí a přidružíte ji k přenosům. Přenosy se poté provedou na pozadí a po jejich dokončení se vaše úloha na pozadí zavolá, aby provedla následné zpracování.
Následné zpracování používá novou třídu BackgroundTransferCompletionGroup. Tato třída je podobná existující BackgroundTransferGroup v tom, že umožňuje seskupit přenosy na pozadí dohromady, ale BackgroundTransferCompletionGroup přidává možnost určit úlohu na pozadí, která se má spustit po dokončení přenosu.
Následujícím způsobem zahájíte přenos na pozadí s následným zpracováním.
- Vytvoření BackgroundTransferCompletionGroup objektu. Pak vytvořte BackgroundTaskBuilder objekt. Nastavte u objektu builderu vlastnost Trigger na objekt skupiny dokončení a vlastnost TaskEntryPoint na vstupní bod úlohy na pozadí, která se má spustit po dokončení přenosu. Nakonec zavolejte BackgroundTaskBuilder.Register metodu pro registraci úlohy na pozadí. Všimněte si, že mnoho skupin dokončení může sdílet jeden vstupní bod úlohy na pozadí, ale pro každou registraci úlohy na pozadí můžete mít jenom jednu skupinu dokončení.
var completionGroup = new BackgroundTransferCompletionGroup();
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.Name = "MyDownloadProcessingTask";
builder.SetTrigger(completionGroup.Trigger);
builder.TaskEntryPoint = "Tasks.BackgroundDownloadProcessingTask";
BackgroundTaskRegistration downloadProcessingTask = builder.Register();
- Dále přidružíte přenosy na pozadí ke skupině dokončení. Po vytvoření všech přenosů povolte skupinu pro dokončení.
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();
- Kód na pozadí úlohy extrahuje seznam operací z podrobností triggeru a váš kód pak může zkontrolovat podrobnosti pro každou operaci a provést odpovídající následné zpracování pro každou operaci.
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
}
}
Úloha následného zpracování je běžnou úlohou na pozadí. Je součástí fondu všech úloh na pozadí a podléhá stejné zásadě správy zdrojů jako všechny úlohy na pozadí.
Všimněte si také, že následné zpracování nenahrazuje obslužné rutiny dokončení popředí. Pokud vaše aplikace definuje obslužnou rutinu pro dokončení v popředí a v době, kdy je přenos souboru dokončen, je spuštěná, budou volány jak obslužná rutina pro dokončení v popředí, tak obslužná rutina pro dokončení na pozadí. Pořadí, ve kterém jsou volána úkoly popředí a pozadí, není zaručeno. Pokud definujete oba, měli byste zajistit, aby oba úkoly správně fungovaly a aby se navzájem neovlivňovaly, pokud poběží souběžně.
Časové limity požadavků
Je potřeba vzít v úvahu dva hlavní scénáře vypršení časového limitu připojení:
Při navazování nového připojení pro přenos se žádost o připojení přeruší, pokud se nenaváže během pěti minut.
Po navázání připojení se přeruší zpráva požadavku HTTP, která nepřijala odpověď během dvou minut.
Poznámka V obou scénářích za předpokladu, že existuje připojení k internetu, bude přenos na pozadí opakovat požadavek až třikrát automaticky. V případě, že není zjištěno internetové připojení, budou další požadavky čekat, dokud nebude zjištěno.
Pokyny k ladění
Zastavení ladicí relace v Microsoft Visual Studio je srovnatelné s zavřením aplikace; Nahrávání PUT se pozastaví a odesílání POST se ukončí. I během ladění by vaše aplikace měla zjistit všechna uložená odesílání a poté je restartovat nebo zrušit. Pokud například nemáte zájem o předchozí operace pro danou ladicí relaci, můžete u aplikace zrušit výčet trvalých operací nahrávání.
Při výčtu stahování a odesílání při spuštění aplikace během ladicí relace můžete nechat aplikaci tato stahování a odesílání zrušit, pokud o předchozí operace v této ladicí relaci nemáte zájem. Všimněte si, že pokud existují Visual Studio aktualizace projektu, jako jsou změny manifestu aplikace, a aplikace se odinstaluje a znovu nasadí, GetCurrentUploadsAsync nemůže vytvořit výčet operací vytvořených pomocí předchozího nasazení aplikace.
Při použití přenosu na pozadí během vývoje se můžete dostat do situace, kdy se interní mezipaměti aktivních a dokončených přenosových operací mohou dostat ze synchronizace. To může vést k nemožnosti spustit nové operace přenosu nebo interagovat s existujícími operacemi a objekty BackgroundTransferGroup . V některých případech může pokus o interakci se stávajícími operacemi způsobit pád aplikace. K tomuto výsledku může dojít, pokud je vlastnost TransferBehavior nastavena na Parallel. K tomuto problému dochází pouze v určitých scénářích během vývoje a nevztahuje se na koncové uživatele vaší aplikace.
Tento problém můžou způsobovat čtyři scénáře používající Visual Studio.
- Vytvoříte nový projekt se stejným názvem aplikace jako existující projekt, ale jiný jazyk (například C++ až C#).
- V existujícím projektu změníte cílovou architekturu (například z x86 na x64).
- V existujícím projektu změníte jazykovou verzi (například z neutrální na en-US).
- V manifestu balíčku (například přidáním podnikového ověřování) v existujícím projektu přidáte nebo odeberete funkci.
Pravidelná údržba aplikací, včetně aktualizací manifestu, které přidávají nebo odebírají funkce, neaktivují tento problém při nasazení aplikace koncovým uživatelům. Chcete-li tento problém vyřešit, zcela odinstalujte všechny verze aplikace a znovu nasaďte pomocí nového jazyka, architektury, jazykové verze nebo funkce. Můžete to provést na obrazovce Start nebo pomocí PowerShellu a rutiny Remove-AppxPackage .
Výjimky v Windows Networking.BackgroundTransfer
Výjimka je vyvolána, když je konstruktoru objektu Windows.Foundation.Uri předán neplatný řetězec pro identifikátor URI (Uniform Resource Identifier).
.NET: Typ Windows.Foundation.Uri se v jazycích C# a VB zobrazuje jako System.Uri.
V jazyce C# a Visual Basic se této chybě můžete vyhnout použitím třídy System.Uri v .NET 4.5 a jedné z metod System.Uri.TryCreate k otestování řetězce přijatého uživatelem aplikace před vytvořením identifikátoru URI.
V jazyce C++ neexistuje žádná metoda, která by se pokusila analyzovat řetězec na identifikátor URI. Pokud aplikace získá vstup od uživatele pro Windows. Foundation.Uri, konstruktor by měl být v bloku try/catch. Pokud dojde k výjimce, aplikace může uživatele upozornit a požádat o nový název hostitele.
Obor názvů Windows.Networking.backgroundTransfer obsahuje praktické pomocné metody a ke zpracování chyb používá výčty z oboru názvů Windows.Networking.Sockets. To může být užitečné pro zpracování konkrétních výjimek sítě v aplikaci jinak.
Chyba zjištěná u asynchronní metody v oboru názvů Windows.Networking.backgroundTransfer je vrácena jako hodnota HRESULT. Metoda BackgroundTransferError.GetStatus slouží k převodu chyby sítě z operace přenosu na pozadí na hodnotu výčtu WebErrorStatus . Většina hodnot výčtu WebErrorStatus odpovídá chybě vrácené nativní operací klienta HTTP nebo FTP. Aplikace může filtrovat konkrétní hodnoty výčtu WebErrorStatus , které upraví chování aplikace v závislosti na příčině výjimky.
V případě chyb ověření parametrů může aplikace také použít HRESULT z výjimky k získání podrobnějších informací o chybě, která výjimku způsobila. Možné hodnoty HRESULT jsou uvedeny v souboru hlaviček Winerror.h . U většiny chyb ověřování parametrů je vrácena hodnota HRESULTE_INVALIDARG.
Důležitá rozhraní API
Příbuzná témata
Windows developer