2015-08-25 15 views
6

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:

ilk await 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"/> 
+3

'GetImage' nasıl çağrılır? Ya da '.Result' veya' .Wait' kullanarak engelliyorsunuz? –

+0

Kodumu göstermek için yayınımı düzenledim. –

+1

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. –

cevap

0

Öncelikle, Windows Phone 8.1 kullanıyorsanız, numaralı Windows.Web.Http ad ve System.Net.Http alan adından değil önerilir. Bazı nedenler this link'da açıklanmaktadır.

Cevabım yeni Windows.Web.Http.HttpClient böylece GetImage yöntemi şöyle olabilir kullanır:

 private async Task<BitmapImage> GetImage(string path) 
     { 
      using (var webCLient = new Windows.Web.Http.HttpClient()) 
      { 
       webCLient.DefaultRequestHeaders.Add("User-Agent", "bot"); 
       var responseStream = await webCLient.GetBufferAsync(new Uri(path)); 
       var memoryStream = new MemoryStream(responseStream.ToArray()); 
       memoryStream.Position = 0; 
       var bitmap = new BitmapImage(); 
       await bitmap.SetSourceAsync(memoryStream.AsRandomAccessStream()); 
       return bitmap; 
      } 
     } 

Ben örnek bir URL üzerinde bu yöntemi test ettik ve bir Image kontrolünde doğru görüntülenir.

<Image 
    Source="{Binding ImagePath}" 
    Stretch="UniformToFill" 
    Height="79" 
    Width="79" /> 

Bu şekilde sizin ImagePath bir kaynağa bir yol olabilir:

İkincisi, neden sadece XAML şöyle görünür şekilde Image kontrol kolu, çevirici olmadan BitmapImage indirirken izin vermeyin internetten ve yerel bir kaynaktan.

0

belki deneyin Eğer Task.Factory içine getImage çağırmak için Başka bir iş parçacığı içinde yürütülecek görevi zorlamak için çalıştırın.

Ayrıca, Bitmap oluşturma konusunda da sorun yaşayabilirsiniz çünkü bitmap, kullanıcı arabiriminde oluşturulmamıştır.

İlgili konular