当前位置: 首页 > news >正文

第二十章:异步和文件I/O.(二十三)

回到网上
在本章之前,本书中唯一的异步代码涉及使用可移植类库WebRequest中唯一可用于此目的的合理类进行Web访问。 WebRequest类使用称为异步编程模型或APM的旧异步协议。 APM涉及两种方法,在WebRequest的情况下,这些方法称为BeginGetResponse和EndGetResponse。
您可以使用TaskFactory的FromAsync方法将这对方法调用转换为基于任务的异步模式(TAP),ApmToTap程序演示如何。 该程序使用Web访问和ImageSource.FromStream加载位图并显示它。 这种技术在第13章中作为ImageSource.FromUri的替代方法展示。
XAML文件包含一个等待位图的Image元素,一个在加载位图时运行的ActivityIndicator,一个显示可能错误消息的Label,以及一个用于开始下载的Button:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ApmToTap.ApmToTapPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness"
                    iOS="0, 20, 0, 0" />
    </ContentPage.Padding>
    <StackLayout>
        <Grid VerticalOptions="FillAndExpand">
            <Label x:Name="errorLabel"
                   HorizontalOptions="Center"
                   VerticalOptions="Center" />
            <ActivityIndicator IsRunning="{Binding Source={x:Reference image}, 
                                                   Path=IsLoading}" />
            <Image x:Name="image" />
        </Grid>
        <Button Text="Load Bitmap"
                HorizontalOptions="Center"
                Clicked="OnLoadButtonClicked" />
    </StackLayout>
</ContentPage>

代码隐藏文件将所有WebRequest代码合并到名为GetStreamAsync的异步方法中。 在实例化TaskFactory和WebRequest对象之后,该方法将BeginGetResponse和EndGetResponse方法传递给TaskFactory的FromAsync方法,该方法然后返回一个可用的Stream的WebResponse对象:

public partial class ApmToTapPage : ContentPage
{
    public ApmToTapPage()
    {
        InitializeComponent();
    }
    async void OnLoadButtonClicked(object sender, EventArgs args)
    {
        try
        {
            Stream stream = 
                      await GetStreamAsync("https://developer.xamarin.com/demo/IMG_1996.JPG"); 
            image.Source = ImageSource.FromStream(() => stream);
        }
        catch (Exception exc)
        {
            errorLabel.Text = exc.Message;
        }
    }
 
    async Task<Stream> GetStreamAsync(string uri)
    {
        TaskFactory factory = new TaskFactory();
        WebRequest request = WebRequest.Create(uri);
        WebResponse response = await factory.FromAsync<WebResponse>(request.BeginGetResponse,
                                                                 request.EndGetResponse,
                                                                null);
        return response.GetResponseStream();
    }
}

然后,Button的Clicked处理程序可以通过使用URI调用GetStreamAsync来获取该Stream对象。 像往常一样,带有await运算符的代码位于try块中以捕获任何可能的错误。 你可以通过故意拼写错误的域名或文件名进行实验,看看你得到了什么样的错误。
Web访问的另一个选项是System.Net.Http命名空间中名为HttpClient的类。 在Xamarin.Forms解决方案中,可移植类库中包含的.NET版本中没有此类,但Microsoft已将该类作为NuGet包提供:
https://www.nuget.org/packages/Microsoft.Net.Http
从Visual Studio或Xamarin Studio中的NuGet管理器,只需搜索“HttpClient”。
HttpClient基于TAP。 异步方法返回Task和Task 对象,某些方法也有CancellationToken参数。
然而,这些方法都没有报告进展,这表明便携式类库仍然无法使用一流的现代Web访问类。
在下一章中,您将看到更多用于等待和探索基于任务的异步模式的一些其他功能,以及令人兴奋的Xamarin.Forms动画实现。

相关文章:

  • 使用.Net Core+IView+Vue集成上传图片功能
  • 三分钟教你同步 Visual Studio Code 设置
  • 《快速阅读术》
  • 容器中 Java 应用程序的内存和 CPU 如何分配?看这一篇就够了!
  • 北斗三号系列核心芯片
  • Hive日期函数笔记
  • 21-Python与设计模式--备忘录模式
  • mysql-connector-java 6版本的jdbc连接问题
  • Android FM模块学习之四源码解析(一)
  • 冲刺第四天 1.4 FRI
  • 有关java中static关键的重写问题
  • Tortoise SVN 创建分支与合并
  • Delphi 发送按键
  • Python - 默认参数的一次性求值
  • Internet TV 影音娱乐新生活
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • avalon2.2的VM生成过程
  • crontab执行失败的多种原因
  • ES6 ...操作符
  • Javascript编码规范
  • JavaScript对象详解
  • Java应用性能调优
  • Material Design
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 对JS继承的一点思考
  • 分享一份非常强势的Android面试题
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 机器学习学习笔记一
  • 理清楚Vue的结构
  • 前端js -- this指向总结。
  • 前端攻城师
  • 一起参Ember.js讨论、问答社区。
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • (1)(1.9) MSP (version 4.2)
  • (23)Linux的软硬连接
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .net实现客户区延伸至至非客户区
  • .NET实现之(自动更新)
  • .stream().map与.stream().flatMap的使用
  • @Async注解的坑,小心
  • @Autowired标签与 @Resource标签 的区别
  • @RequestMapping用法详解
  • [20140403]查询是否产生日志
  • [20161101]rman备份与数据文件变化7.txt
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [BZOJ] 3262: 陌上花开