2012-08-16 16 views
5

मेरा विन आरटी एप्लिकेशन जो विंडोज 8 बीटा पर वीएस2012 आरसी के साथ काम करता है, अब दृश्य स्टूडियो के अंतिम संस्करणों और विंडोज 8 समस्या के कारण है, जो फाइल बना रहा/खोल रहा है OnSuspending के भीतर केवल तभी काम करता है जब मैं फ़ाइल निर्माण विधि में डीबगर-ब्रेकपॉइंट सेट करता हूं।StorageFolder.CreateFileAsync ऐप से कॉल करते समय क्रैश होता है। ओनसस्पेंडिंग

private void OnSuspending(object sender, SuspendingEventArgs e){       
    var deferral = e.SuspendingOperation.GetDeferral();      
    if (null != m_document) Save(); 
    deferral.Complete(); 
} 

async void Save(){ 
    var folder = KnownFolders.DocumentsLibrary;  
    var file = await folder.CreateFileAsync(GetFileName(),Windows.Storage.CreationCollisionOption.ReplaceExisting);     

    var xDoc = GetXDocument(); 
    using (var stream = await file.OpenStreamForWriteAsync()){ 
     xDoc.Save(stream);      
    }   
} 
  • अगर मैं StorageFile file = await folder.CreateFileAsync(... पर एक ब्रेकपाइंट सेट, डिबगर में प्रवेश करती है और अगर मैं जारी रखने के , सब ठीक काम करता है।

  • हालांकि अगर मैं ब्रेकपॉइंट सेट नहीं करता हूं, तो फ़ाइल बनाई जाएगी, लेकिन एक्सएमएल की सामग्री सहेजी नहीं जाएगी (फ़ाइल खाली है)।

  • यदि मैं StorageFile file = await folder.CreateFileAsync(... लाइन के नीचे एक ब्रेकपॉइंट सेट करता हूं, तो डीबगर कभी प्रवेश नहीं करता है!

क्या किसी को कोई विचार है? मैंने एक संस्करण का भी परीक्षण किया है जो बहुत ही प्रभाव के साथ folder.OpenStreamForWriteAsync का उपयोग करता है।

+0

क्या यह ऑपरेशन समाप्त करने के लिए समय समाप्त हो सकता है? – mydogisbox

+0

@mydogisbox: ऐसा लगता है। हालांकि मुझे नहीं पता क्यों। ऐसा लगता है कि सेव() में प्रतीक्षा कमांड सृजन तक इंतजार नहीं करता है, लेकिन सेव-फ़ंक्शन से तुरंत (या फ़ाइल निर्माण के बाद) लौटाता है। यह भी मैं देखता हूं, अगर मैं प्रत्येक विधि कॉल के बाद Debug.WriteLine-call जोड़ता हूं।ब्रेकपॉइंट के बिना, कोड "var xDox = GetXDocument()" - कॉल तक कभी नहीं पहुंच पाएगा। यह फ़ाइल निर्माण के बाद लौटाता है (लेकिन अपवाद के बिना)। – HCL

उत्तर

7

समस्या सहेजने के लिए कॉल था। केवल पहला भाग (फ़ाइल का निर्माण) का इंतजार किया गया था, दूसरा भाग (एक्सएमएल सहेजना) एसिंक किया गया था, और इसलिए निलंबित ऑपरेशन का स्थगित सहेजने की प्रक्रिया के अंत तक नहीं रहा है।

इस समस्या से बचने के लिए एक संभावित समाधान सहेजने के पूरा होने के लिए स्पष्ट रूप से प्रतीक्षा करना है। यह ऑनसस्पेंडिंग-विधि को aysnc के रूप में घोषित करके पूरा किया जा सकता है और फिर प्रतीक्षा कीवर्ड के साथ ऑपरेशन सहेजने के पूरा होने की प्रतीक्षा कर रहा है (कृपया सहेजें-विधि का कार्य वापसी प्रकार देखें)।

private async void OnSuspending(object sender, SuspendingEventArgs e){       
    var deferral = e.SuspendingOperation.GetDeferral();      
    if (null != m_document) await Save(); 
    deferral.Complete(); 
} 

async Task Save(){ 
    var folder = KnownFolders.DocumentsLibrary;  
    var file = await folder.CreateFileAsync(GetFileName(),Windows.Storage.CreationCollisionOption.ReplaceExisting);     

    var xDoc = GetXDocument(); 
    using (var stream = await file.OpenStreamForWriteAsync()){ 
     xDoc.Save(stream);      
    }   
} 

मुझे आशा है कि इस पोस्ट में मदद करता है क्यों समस्या W8 के बीटा के साथ हुई नहीं किया है किसी और जो एक ही ख़तरा में गिर गया है (मैं सोच रहा हूँ, लेकिन मुझे लगता है कि एमएस आवेदन termination- अनुकूलित किया है लगता है प्रक्रिया और इसलिए निलंबन प्रक्रिया के बाद अप्रत्याशित काम के लिए कम समय है) ...

+0

अंत में 'deferral.Complete();' कॉल करने के लिए मत भूलना। – mydogisbox

+0

@mydogisbox: धन्यवाद, लेकिन "deferall.Commit()" हमेशा चालू था, ऑनसस्पेंडिंग के कार्यान्वयन को देखें। उदाहरण को छोटा बनाने के लिए मैंने केवल कोशिश/आखिरकार हटा दिया। समस्या पूर्ण नहीं थी, लेकिन एक्सएमएल का क्रमबद्धता। मेरे शुरुआती दिनचर्या (सहेजें) में, मैंने टिप्पणी नहीं की है कि विधि आंशिक रूप से एसिंक्रोनस निष्पादित करेगी ("प्रतीक्षा फ़ोल्डर" बनाएं ... "के बाद कोड देखें। समाधान पूरी विधि के पूरा होने की प्रतीक्षा करना था (ऑनसस्पेंडिंग में प्रतीक्षा और सहेजें() के वापसी प्रकार "कार्य" देखें)। – HCL

3

आप समय से बाहर चल रहे हैं। आप लगभग 5 सेकंड के साथ शुरू करते हैं, लेकिन यदि आप यह घोषणा नहीं करते हैं कि आप इसका उपयोग करेंगे तो आपका समय कम हो जाएगा। इसे आजमाएं:

private async void OnSuspending(object sender, SuspendingEventArgs e) 
{ 
    var deferral = e.SuspendingOperation.GetDeferral(); 
    try 
    { 
     await Task.Delay(1000); 
     Debug.WriteLine("Done"); 
    } 
    finally 
    { 
     deferral.Complete(); 
    } 
} 

अधिक जानकारी के लिए here देखें। आधिकारिक दस्तावेज के लिए here देखें:

नोट आप अतुल्यकालिक काम करने के लिए की जरूरत है अपने ऐप निलंबित आप जब तक के बाद अपने काम पूरा निलंबित के पूरा होने को स्थगित करने की आवश्यकता होगी जा रहा है। आप जब तक आप पूर्ण विधि SuspendingDeferral वस्तु लौट आए पर कॉल निलंबित की पूरा होने में देरी करने के SuspendingOperation वस्तु (घटना args के माध्यम से उपलब्ध है) पर GetDeferral विधि का उपयोग कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद! अफसोस की बात है, यह समस्या का समाधान नहीं करता है। यदि आप मेरे कोड उदाहरण को देखते हैं, तो मैं पहले ही निलंबन को रोकता हूं, मैंने उदाहरण के सादगी के लिए केवल अपवाद हैंडलिंग को हटा दिया है। हालांकि इससे कोई फर्क नहीं पड़ता। – HCL

+0

मुझे समस्या मिली है। कृपया अपना उत्तर देखें और फिर अपनी पोस्ट के लिए धन्यवाद। – HCL

+0

@ एचसीएल मैंने जो समाधान दिया था वह था जो आपको चाहिए ... मैंने अनजाने में दो महत्वपूर्ण भागों को छोड़ दिया ... मैंने उन्हें अभी वापस रखा। – mydogisbox

संबंधित मुद्दे