2012-02-25 10 views
5

में फ़ाइलकुछ अपवाद है जब पहुँच जब मैं WinRT में फ़ाइलों तक पहुँचने मैं कुछ समस्याएं हैं WinRT

प्रश्न 1:

var file = await StorageFile.GetFileFromPathAsync(filePath); 

कभी कभी GetFileFromPathAsync एक फेंक होगा अपवाद "RPC सर्वर उपलब्ध नहीं है"।

प्रश्न 2:

MusicProperties musicProp = await file.Properties.GetMusicPropertiesAsync(); 

कभी कभी यह होगा एक अपवाद फेंकता है:

Unable to cast COM object of type 'Windows.Storage.FileProperties.MusicProperties' to interface type 'Windows.Storage.FileProperties.IMusicProperties'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{BC8AAB62-66EC-419A-BC5D-CA65A4CB46DA}' failed due to the following error: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)). 

प्रश्न 3:

Unable to cast COM object of type 'Windows.Storage.StorageFile' to interface type 'Windows.Storage.IStorageFile'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{C7034384-F12E-457A-89DA-69A5F8186D1C}' failed due to the following error: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)). 
:

QueryOptions query = new QueryOptions(CommonFileQuery.OrderByMusicInfo, extensionList); 
StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(query); 
IReadOnlyList<IStorageFile> files = await queryResult.GetFilesAsync(); 

कभी कभी यह एक अपवाद फेंक होगा

ये अपवाद हर समय फेंक नहीं जाएंगे, लेकिन कभी-कभी। क्यूं कर?

उत्तर

2

यह ऐसी समस्या है जो थ्रेडिंग द्वारा प्रेरित है, यह एक COM त्रुटि संदेश है। पूरी तरह से अप्रत्याशित नहीं, WinRT भारी COM आधारित है। त्रुटि संदेश क्या कहता है कि एक थ्रेड पर बनाया गया एक इंटरफ़ेस पॉइंटर का उपयोग बिना किसी धागे के किसी अन्य धागे पर किया जा रहा है।

यह ऐसा कुछ है जिसे आप आम तौर पर कच्चे COM कोड लिखते समय स्वयं करना चाहते हैं। अंतर्निहित COM सहायक कार्य खुशीपूर्वक नामांकित CoMarshalInterThreadInterfaceInStream() है। हालांकि, आप स्पष्ट रूप से प्रबंधित कोड का उपयोग कर रहे हैं। जहां आवश्यक हो वहां मार्शल पॉइंटर्स के लिए सीएलआर का काम है। इसने .NET संस्करण 1.0 पर वापस सभी तरह से भरोसेमंद और लगातार किया है, मैंने कभी ऐसा मामला नहीं देखा है जहां यह फंसे हुए हैं।

यह सी # प्रतीक्षा/एसिंक पाइपलाइन या सीएलआर के विनआरटी प्रक्षेपण में एक बग को बहुत दृढ़ता से संकेत देता है। खासकर जब यह नकली है, इस तरह की मार्शलिंग बग सुसंगत होना चाहिए। कुछ भी आप स्वयं को ठीक नहीं कर सकते हैं। बग की रिपोर्ट करने के लिए connect.microsoft.com पोर्टल का उपयोग करें, उन्हें एक छोटी रेपो परियोजना की आवश्यकता होगी जो समस्या का प्रदर्शन करे।

अभी आपके पास उपलब्ध एकमात्र कामकाज है जो आपके ऐप में थ्रेडिंग को सावधानी से नियंत्रित करना है। केवल उसी थ्रेड पर ऑब्जेक्ट का उपयोग करके इस दुर्घटना से बचें जिसे आपने बनाया है। यह बिल्कुल गारंटी नहीं है कि आप बग से बच जाएंगे। अन्यथा जब आप प्री-बीटा कोड का उपयोग करने का प्रयास करते हैं तो आप सिरदर्द की तरह उम्मीद कर सकते हैं।