2016-05-17 9 views
3

Ich möchte eine Aufgabe abbrechen, die eine Datei herunterlädt. Meine Forschung sagt, dass dies mit der Verwendung eines CancellationToken machbar sein sollte. Ich habe die Richtlinien gefolgt erklärt here und machte alles funktioniert, bis ich diese Codezeile ändern musste:Alternative zu CancellationToken

await cloudBlockBlob.DownloadToStreamAsync(writeStream); 

wie diese Linie zu sein:

await blockBlob.DownloadToStreamAsync(writeStream, cancellationToken); 

Die spätere Methode schlägt fehl, weil ich habe nicht die neueste Version von Windows Azure. Während die neueste Version diese zweite Methode unterstützt (wie gesehen here) Ich habe einfach keinen Zugriff auf diese Methode, und ein Upgrade auf die neueste Version ist KEINE Option.

Gibt es eine andere Möglichkeit, eine Aufgabe mit dieser Codezeile abzubrechen, oder bin ich gezwungen, diese Funktion zu löschen?

Edit: Ich verwende Microsoft.WindowsAzure.Storage.dll v6.0.0.0

+0

Bitte teilen Sie uns mit, welche Version der Storage Client-Bibliothek (Microsoft.WindowsAzure.Storage.dll) Sie verwenden? –

Antwort

2

Gibt es eine andere Möglichkeit, eine Aufgabe mit dieser Codezeile abzubrechen, oder bin ich gezwungen, diese Funktion zu löschen?

Sie können unkündbaren Code nicht einfach abbrechen. Dies gilt unabhängig von Sprache, Plattform, Betriebssystem oder ob der Code asynchron/synchron ist.

Wenn der Code nicht nativ die Löschung unterstützt (wie in Ihrem Fall), dann haben Sie ein paar Optionen.

Man soll die Operation (download) nicht abbrechen; Abbrechen Sie einfach die warte. Dies gibt Ihnen den Vorteil, dass Sie so tun können,, um den Vorgang abzubrechen, aber beachten Sie, dass die Operation weiterhin ausgeführt wird, als ob nichts passiert wäre.

Eine andere Option ist es, einen raffinierten kleinen Trick zu verwenden, der für die meisten Windows-Vorgänge funktioniert: Schließen Sie einen zugrunde liegenden Handle. Dies führt normalerweise dazu, dass der Vorgang fehlschlägt. In diesem Fall können Sie den Blob nicht schließen, aber Sie können versuchen, den Stream zu schließen, in den er schreibt.

Wenn die Operation synchron ist, können Sie sie um eine Stufe erweitern, indem Sie die Operation in einem separaten Thread ausführen und dann diesen Thread beim Abbrechen abbrechen. Ich empfehle diesen Ansatz nicht, da das Abbrechen von Threads für die langfristige Gesundheit Ihrer Anwendung sehr schlecht ist. Dies ist jedoch der von ASP.NET verwendete Ansatz, bei dem gelegentlich auch Ihre Anwendung recycelt wird, um diese langfristigen Gesundheitsprobleme zu beheben.

Schließlich, wenn Sie eine zuverlässige Möglichkeit benötigen, um eine Operation wirklich abzubrechen, ohne die Gefahr des Abbrechens von Threads, gibt es die nukleare Option: Legen Sie die Operation in einen separaten Prozess. Das Töten eines Prozesses ist sauber (im Gegensatz zum Abbrechen von Threads), und es wird den Vorgang tatsächlich zum Abbrechen zwingen. Ich musste das nur einmal tun; es war nicht schön, aber es hat funktioniert.

1

Sie können jederzeit eine neue Aufgabe abbrechen, die Kündigung in API in paar Möglichkeiten nicht unterstützt. Der, für den ich mich normalerweise entscheide, ist hier. Beachten Sie alle Nebenwirkungen.

http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx

Andere Art und Weise ist, dass Sie Task.Run mit Unterdrückungslogik in sie verwenden.

+0

Um diese Quelle zu zitieren: "Die Anforderung, dass die asynchrone Operation selbst abgebrochen wird ... wird aktiviert, indem ein CancellationToken an die betreffende asynchrone Operation übergeben wird." Das scheint sich auf meine fehlende Methode zu verlassen. –