我正在编写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);
发生这种情况时不会显示错误。
我能否对上述代码有所帮助?
答案 0 :(得分:3)
这就是async
的工作原理。该函数运行直到第一个等待然后它返回。异步任务完成后,将执行该方法的其余部分。编译器生成一个状态机来执行该操作,它基本上将该方法的其余部分注册为延续。
您的方法应该返回Task
而不是void
。这样,您可以检查函数何时完成,并且DownloadAsyncFile
内引发的异常可以在函数外部传播。有关最佳做法的更多建议,请参阅Best Practices in Asynchronous Programming。 Void返回async
方法几乎只适用于事件处理程序。