Xamarin for Androidで、System.Net.Http.HttpClient
を使用して5つの画像を非同期にロードするループを作成しました。 5つのリクエストの開始は即座に実行されますが、のいずれかがになることはありません。レスポンスが個別に非同期に来ないのはなぜですか?Xamarinで非同期HttpClient呼び出しのループがすべて終了するまでブロックされるのはなぜですか?
私はXamarinでスレッドをどのように処理するかについてよく知らないので、何か間違っている可能性があります。 UIスレッドから呼び出さないといけませんか? HttpClientのスケジューラやスレッドポリシーを指定する方法はありますか?
ロード機能のためのコード:
// This method is called 5 times in a foreach loop, initated from the UI thread, not awaited
private async void LoadAsync(String uri)
{
Bitmap bitmap = await imgSvc.loadAndDecodeBitmap(uri);
image.SetImageBitmap(bitmap);
}
public async Task<Bitmap> loadAndDecodeBitmap(String uri) {
var client = new HttpClient();
byte[] data = await client.GetByteArrayAsync(uri);
Bitmap img = BitmapFactory.DecodeByteArray(data, 0, data.Length);
return img;
}
編集:this repo
で最小、再現可能な例は、参照5と1との間にその例でImagesToLoad
を切り替えてみてください方法のロード時間最初に画像が劇的に変化します(コンピュータで約2秒の違いがあります)。
Load log 10 images
Load log if I only load 1
非同期呼び出しのループを問題の再現に使用できる[mcve]として表示できますか。あなたがリンクしている解決策は裸の骨プロジェクトだけです。 – Nkosi
これらのメソッドを呼び出すコードが含まれるように質問を編集してください。 – Progman
申し訳ありませんが間違ったブランチにリンクしました。支店「ラップトップ」https://github.com/Nilzor/newsapp/tree/laptop/xamarin-news/xam-android-news/xam-android-newsをチェックしてください。私は明日、完全で検証可能な最小限の例を提供します – Nilzor