第二十章:非同步和檔案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動畫實現。
相關文章
- 第二十章:非同步和檔案I/O.(一)非同步
- 第二十章:非同步和檔案I/O.(九)非同步
- 第二十章:非同步和檔案I/O.(八)非同步
- 第二十章:非同步和檔案I/O.(十四)非同步
- 第二十章:非同步和檔案I/O.(二)非同步
- 第二十章:非同步和檔案I/O.(二十一)非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 檔案備份和同步工具:Syncovery for mac v9.49i啟用版Mac
- Linux-檔案寫入和檔案同步Linux
- SpringBoot非官方教程 | 第二十三篇: 非同步方法Spring Boot非同步
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- 雲備份和同步檔案資料
- rsync同步和備份檔案到本地
- 談談對不同I/O模型的理解 (阻塞/非阻塞IO,同步/非同步IO)模型非同步
- iGuard和NFS檔案同步的解決方案NFS
- 實現手機和PC檔案同步 GitLab和TermuxGitlabUX
- Python:讀寫檔案(I/O) | 組織檔案Python
- 054 非單檔案元件元件
- 第二章 檔案和目錄操作命令
- Java 非阻塞 IO 和非同步 IOJava非同步
- 使用Unison 同步檔案
- Concurrency(二十三: 非阻塞演算法下)演算法
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 使用ln同步檔案內容,支援忽略檔案
- Mac檔案同步軟體Mac
- Java中I/O流:阻塞和非阻塞範例Java
- 免費檔案同步軟體有哪些?檔案同步軟體哪個好
- 前端週刊第二十三期前端
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- http不使用Form表單傳送檔案資料和非檔案資料(上傳篇)HTTPORM
- 檔案同步是什麼?解析6個最佳的檔案同步應用軟體
- Linux 檔案同步工具之 rsyncLinux
- ios檔案同步傳輸工具iOS
- 重學OC第二十三篇:blockBloC