2012-11-29 13 views
5

मैं एक कस्टम वर्ग है में Awaitable तरीके (सामान को आसान बनाने, मैं कोड को छीन लिया है):कॉलिंग संपत्ति Accessor [Windows स्टोर ऐप्स/मेट्रो Apps]

public class AlbumItem 
{ 
    public StorageFile AlbumThumbnail { get; set;} 
} 

जब मैं एक ListView को यह बाँध:

<ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid Height="100" Background="#FFabe372"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="80" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Image Source="{Binding AlbumSource}" Margin="10" Stretch="Uniform"></Image> 
        <TextBlock Margin="20 5" Grid.Column="1" Style="{StaticResource AlbumListViewItemStyle}" Text="{Binding AlbumDisplayText}"></TextBlock> 
       </Grid> 

      </DataTemplate> 
</ListView.ItemTemplate> 

Image के स्रोत, AlbumSource के लिए निर्धारित है के रूप में मैं AlbumSource एक Get -only संपत्ति के रूप में लागू करने के लिए सोचा है:

public class AlbumItem 
{ 
    public StorageFile AlbumThumbnail { get; set;} 

    public BitmapImage AlbumSource 
    { 
     get 
     { 
      BitmapImage bmp = new BitmapImage(); 
      bmp.SetSource(await AlbumThumbnail.OpenReadAsync()); 
      return bmp; 
     } 
    } 
} 

जैसा कि उम्मीद है कि मैं एक्सेसर विधि में await कीवर्ड का उपयोग नहीं कर सकता, साथ ही मैं async विधि के रूप में एक संपत्ति स्टब घोषित नहीं कर सकता।

क्या कोई मुझे सही दिशा में इंगित कर सकता है? मैं बाद में Converter कोशिश कर रहा हूं। धन्यवाद!

उत्तर

7

आईएमएचओ संपत्ति एक्सेसर्स हमेशा लगभग तुरंत लौटना चाहिए। लंबे समय तक चलने वाले संचालन को संपत्ति एक्सेसर के अंदर निष्पादित नहीं किया जाना चाहिए क्योंकि व्यापक रूप से धारणा धारणा के कारण इसका महत्वपूर्ण प्रभाव प्रभाव हो सकता है कि एक एक्सेसर मूल रूप से एक परिवर्तनीय पठन ऑपरेशन होता है (यानी गुणों को बहुत से एक्सेस किया जा सकता है, लूप में, बाद में पहुंच आदि के लिए कैश नहीं किया जा सकता है।)। हालांकि dkackman का जवाब मुझे एक और आयाम दिया दोनों, धन्यवाद पता लगाने के लिए

private async Task SetAlbumSourceAsync() 
{ 
    bmp = new BitmapImage(); 
    var source = await AlbumThumbnail.OpenReadAsync(); 
    bmp.SetSource(source); 
    RaisePropertyChanged("AlbumSource"); 
} 

BitmapImage bmp; 
public BitmapImage AlbumSource 
{ 
    get 
    { 
     if (bmp == null) // might need a better sync mechanism to prevent reentrancy but you get the idea 
      SetAlbumSourceAsync(); 

     return bmp; 
    } 
} 
+0

धन्यवाद! मुझे विचार मिला, लेकिन फ्लैवियन की विधि ने मेरी तत्काल आवश्यकता को हल किया। मैं आपके दृष्टिकोण का पता लगाऊंगा और देख सकता हूं कि मैं इसे प्राप्त कर सकता हूं और इसके बाद काम कर रहा हूं। –

+2

+1 यह अधिक सही उत्तर है। कोई तकनीकी कारण नहीं है कि 'async' गुण मौजूद नहीं हो सकते हैं; यह एक डिजाइन निर्णय था क्योंकि एक "असीमित संपत्ति" संपत्ति की अवधारणा के खिलाफ जाती है। –

+0

हाँ, मैंने इस विधि का उपयोग करके अब तक मेरे गुणों को लागू किया है, और हाँ, यह मेरे यूआई को दबा नहीं देता है! बहुत बहुत धन्यवाद! –

2

यदि आप await का उपयोग करते हैं, तो वापसी का प्रकार Task<BitmapImage> होना होगा। यदि आप अपने एक्सएएमएल से जुड़ने में सक्षम होना चाहते हैं, तो आपको BitmapImage वापस करने की आवश्यकता है, और इसलिए await का उपयोग नहीं कर सकते हैं। कार्य का उपयोग करें। इसके बजाय परिणाम:

public BitmapImage AlbumSource 
{ 
    get 
    { 
     BitmapImage bmp = new BitmapImage(); 
     bmp.SetSource(AlbumThumbnail.OpenReadAsync().GetResults()); 
     return bmp; 
    } 
} 
+0

इस विधि मेरी समस्या का हल,:

मैं इस तरह कुछ करना चाहते हैं! लेकिन मुझे 'टास्क। रीसेट 'को' टास्क.गेट्रेशल्ट्स() 'में बदलना पड़ा और' सेटसोर्स 'पर सिंटैक्स त्रुटि के लिए मेरा बुरा (इसके बजाय' सेटसोर्स()' होना चाहिए)। –