gpt4 book ai didi

c# - 在 Windows Phone 8 中异步下载和保存文件

转载 作者:太空狗 更新时间:2023-10-30 01:04:50 24 4
gpt4 key购买 nike

如何异步下载文件并将其保存到 IsolatedStorage?为此,我首先使用了 WebClient,但我不能等到完成,所以我找到了一些有用的代码 here .

但是,这也不是完整的格式。我找到了函数:

public static Task<Stream> DownloadFile(Uri url)
{
var tcs = new TaskCompletionSource<Stream>();
var wc = new WebClient();
wc.OpenReadCompleted += (s, e) =>
{
if (e.Error != null) tcs.TrySetException(e.Error);
else if (e.Cancelled) tcs.TrySetCanceled();
else tcs.TrySetResult(e.Result);
};
wc.OpenReadAsync(url);
return tcs.Task;
}

但是如何将这个文件保存到IsolatedStorage?有人帮我完成这个功能!

最佳答案

这,什么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;
}
}

我添加了 Cancellation Token - 这意味着您的下载操作可以在 Button.Click 之后取消。另一方面,如果 await DownloadFile(uriToDownload) 被取消,它会自动抛出 OperationCancelled - 然后您捕获该异常并返回足够的结果。

我没有运行该代码,但它可能显示了主要思想。

关于c# - 在 Windows Phone 8 中异步下载和保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com