我正在编写一个Xamarin应用程序,并尝试异步下载一个图像,然后将该图像保存到文件中。
这是我的代码:
public async void DownloadAsyncFile(string webAddress, string fileName)
{
var webClient = new WebClient ();
var uri = new Uri (webAddress);
byte[] bytes = null;
try
{
bytes = await webClient.DownloadDataTaskAsync(uri);
CreateFolderFromFileName (fileName);
File.WriteAllBytes(fileName, bytes);
}
catch(TaskCanceledException){
System.Console.WriteLine ("Task Canceled!");
return;
}
catch(Exception e){
System.Console.WriteLine (e.ToString());
return;
}
}
public void CreateFolderFromFileName(string fileName)
{
string folderName = GetFolderPathFromFileName (fileName);
System.IO.Directory.CreateDirectory(folderName);
}
代码正在执行,但是,DownloadAsyncFile
函数退出到函数中的最后一行代码:
bytes = await webClient.DownloadDataTaskAsync(uri);
发生这种情况时不会显示任何错误。
我能在上面的代码方面得到一些帮助吗?
async
就是这样工作的。该函数一直运行到第一个等待,然后返回。该方法的其余部分将在异步任务完成后执行。编译器生成一个状态机来执行此操作,它基本上将方法的其余部分注册为延续。
您的方法应该返回Task
而不是void
。这样,您就可以检查函数何时完成,并且在DownloadAsyncFile
内部引发的异常可以在函数外部传播。有关最佳实践的更多建议,请参阅异步编程中的最佳实践。返回Void的async
方法几乎只适用于事件处理程序。