2012-02-25 14 views
5

Tengo algunos problemas cuando accedo a los archivos en WinRTalguna excepción cuando el acceso al archivo en WinRT

la pregunta 1:

var file = await StorageFile.GetFileFromPathAsync(filePath); 

veces la GetFileFromPathAsync generará un "servidor de la RPC no está disponible" excepción.

la pregunta 2:

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

él a veces produce una excepción:

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

la pregunta 3:

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

veces será una excepción:

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

Estas excepciones no se lanzarán todo el tiempo, pero a veces. ¿Por qué?

Respuesta

2

Es el tipo de problema que se provoca al enhebrar, es un mensaje de error COM. No del todo inesperado, WinRT está fuertemente basado en COM. Lo que dice el mensaje de error es que un puntero de interfaz que se creó en un subproceso se está utilizando en otro subproceso sin haber sido ordenado.

Esto es algo que normalmente tiene que hacer usted mismo al escribir el código COM sin procesar. La función de ayudante COM subyacente es alegremente llamada CoMarshalInterThreadInterfaceInStream(). Sin embargo, claramente estás usando código administrado. El trabajo de CLR es ordenar los indicadores cuando sea necesario. Lo ha hecho de forma fiable y consistente hasta la versión 1.0 de .NET, nunca he visto un caso en el que haya fallado.

Esto indica con mucha fuerza un error en la plomería C# await/async o en la proyección WinRT de CLR. Especialmente dado que es falso, este tipo de error debería ser consistente. Nada que puedas arreglar tú mismo. Use el portal connect.microsoft.com para reportar el error, necesitarán un pequeño proyecto de reprografía que demuestre el problema.

La única solución alternativa que tendrá disponible en este momento es controlar cuidadosamente el subproceso en su aplicación. Evite este contratiempo usando solo el objeto en el mismo hilo que lo creó. Esto no es exactamente una garantía de que evadirás el error. De lo contrario, el tipo de dolor de cabeza que puede esperar cuando intenta utilizar el código pre-beta.

Cuestiones relacionadas