Bir Windows Phone 8.1 uygulaması geliştiriyorum. Küçük resimli başlıkların bir listesini içeren bir ekranım var.Görüntüyü indirirken asimetri/durdurulması beklemiyor
public class NewsCategory : ObservableObject
{
...
public string Title { get; set; }
public ObservableCollection<News> Items { get; set; }
}
Haberler:
public class News : ObservableObject
{
...
public string Title { get; set; }
public string ImagePath { get; set; }
}
Önce
NewsCategories = new NotifyTaskCompletion<ObservableCollection<NewsCategory>>(_newsService.GetNewsCategoriesAsync());
NewsCategory (NotifyTaskCompletion
pattern tatmin) JSON haber toplama almak için asenkron http talep ediyorum
Şimdiye kadar mükemmel çalışıyor, ancak ImagePath
özelliğini aldığım anda, verilen görüntüyü indirmek ve görüntülemek istiyorum. Burada eşzamansız olarak yapmak için bir çözüm buldum: WP 8.1 Binding image from a http request - böylece xaml görüntü yolunu aldığında, NotifyTaskCompletion
modelini kullanarak bir dönüştürücü sınıfı (BinaryToImageSourceConverter
) çağırır.
sorun şu yönteminde oluşur:
ilkawait
denir private async Task<BitmapImage> GetImage(string path)
{
HttpClient webCLient = new HttpClient();
var responseStream = await webCLient.GetStreamAsync(path);
var memoryStream = new MemoryStream();
await responseStream.CopyToAsync(memoryStream);
memoryStream.Position = 0;
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(memoryStream.AsRandomAccessStream());
return bitmap;
}
, ayıklayıcı sonraki hattı ve döner asla yöntemi ulaşamazlar. string path
değişkeninde uygun içerik var.
Şimdiye kadar ConfigureAwait(false)
kullanmayı denedim, ancak benim durumumda çalışmıyor. Ben de konunun öğrendim
: Deadlock while using async await ki:
Eğer
ConfigureAwait(false)
kullanıyorsanız, size Bağlam hakkında sakıncası programınızı söyle. Bazı kilitlenme sorunlarını çözebilir, ancak genellikle doğru çözüm değildir. Doğru çözüm, büyük olasılıkla hiç bir zaman engellenmeyen bir şekilde görevleri beklemek ve asenkronize olmamaktır.
Bu şeyleri engelleme yolunda nerede bulabileceğimi bilmiyorum. Bu çıkmazın sebebi ne olabilir?
Ve hepsi yanlış bir yaklaşımla ilgili ise, küçük resimlerin bir öğe koleksiyonuna yüklenmesi için daha uygun olabilecek herhangi bir desen biliyor musunuz?
Yardımlarınız için teşekkür ederiz.
güncelleme:GetImage
çağrılır nasıl: Konuyla gibi:
public class WebPathToImage : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value == null) return null;
return new NotifyTaskCompletion<BitmapImage>(GetImage((String)value));
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{ throw new NotImplementedException(); }
private async Task<BitmapImage> GetImage(string path)
{
using (var webCLient = new HttpClient())
{
webCLient.DefaultRequestHeaders.Add("User-Agent", "bot");
var responseStream = await webCLient.GetStreamAsync(path).ConfigureAwait(false);
var memoryStream = new MemoryStream();
await responseStream.CopyToAsync(memoryStream);
memoryStream.Position = 0;
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(memoryStream.AsRandomAccessStream());
return bitmap;
}
}
}
ve xaml WP 8.1 Binding image from a http request:
<Image
DataContext="{Binding ImagePath, Converter={StaticResource WebPathToImage}}"
Source="{Binding Result}"
Stretch="UniformToFill"
Height="79" Width="79"/>
'GetImage' nasıl çağrılır? Ya da '.Result' veya' .Wait' kullanarak engelliyorsunuz? –
Kodumu göstermek için yayınımı düzenledim. –
Doğrudan yanlış olabilecek hiçbir şey görmüyorum. Bunun küçük ve minimal bir şekilde çoğalmasını sağlayabilirseniz, bu yardımcı olacaktır. –