這個,貼什麼har07,應該工作。如果你需要擴展你的方法一點點,我會嘗試做這樣的事情(儘管它沒有進行測試,但應工作):
(評論重修後 - 與取消)
// first define Cancellation Token Source - I've made it global so that CancelButton has acces to it
CancellationTokenSource cts = new CancellationTokenSource();
enum Problem { Ok, Cancelled, Other }; // results of my Task
// cancelling button event
private void CancellButton_Click(object sender, RoutedEventArgs e)
{
if (this.cts != null)
this.cts.Cancel();
}
// the main method - I've described it a little below in the text
public async Task<Problem> DownloadFileFromWeb(Uri uriToDownload, string fileName, CancellationToken cToken)
{
try
{
using (Stream mystr = await DownloadFile(uriToDownload))
using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
{
if (ISF.FileExists(fileName)) return Problem.Other;
using (IsolatedStorageFileStream file = ISF.CreateFile(fileName))
{
const int BUFFER_SIZE = 1024;
byte[] buf = new byte[BUFFER_SIZE];
int bytesread = 0;
while ((bytesread = await mystr.ReadAsync(buf, 0, BUFFER_SIZE)) > 0)
{
cToken.ThrowIfCancellationRequested();
file.Write(buf, 0, bytesread);
}
}
}
return Problem.Ok;
}
catch (Exception exc)
{
if (exc is OperationCanceledException)
return Problem.Cancelled;
else return Problem.Other;
}
}
// and download
private async void Downlaod_Click(object sender, RoutedEventArgs e)
{
cts = new CancellationTokenSource();
Problem fileDownloaded = await DownloadFileFromWeb(new Uri(@"http://filedress/myfile.txt", UriKind.Absolute), "myfile.txt", cts.Token);
switch(fileDownloaded)
{
case Problem.Ok:
MessageBox.Show("File downloaded");
break;
case Problem.Cancelled:
MessageBox.Show("Download cancelled");
break;
case Problem.Other:
default:
MessageBox.Show("Other problem with download");
break;
}
}
我添加了取消令牌 - 這意味着您的下載操作可以在Button.Click後取消。另一方面,如果等待DownloadFile(uriToDownload)被取消,它會自動拋出OperationCancelled - 然後你捕獲該異常並返回足夠的結果。
我還沒有運行該代碼,但它可能會顯示主要想法。
在Windows Phone 8中的'WebClient'支持異步編程(見** TaskAsync **後綴方法)。但是,[HttpClient類](http://msdn.microsoft.com/library/system.net.http.httpclient.aspx)可以從[Microsoft HTTP Client Libraries](https:// www。 nuget.org/packages/Microsoft.Net.Http)** NuGet **包更適合異步編程。你的代碼將變得更加乾淨。返回異步方法的Task也應該加後綴** Async **(已經有** Async **後綴方法的'WebClient'例外)。 –