Pregunta

Tengo algunos problemas cuando accede a los archivos en WinRT

Pregunta 1:

var file = await StorageFile.GetFileFromPathAsync(filePath);

A veces, el getFileFRompathasync lanzará un "servidor RPC no está disponible" Excepción.

Pregunta 2:

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

A veces lanzará 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)).

Pregunta 3:

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

A veces lanzará 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é?

¿Fue útil?

Solución

Es el tipo de problema que se induce por el enhebrado, es un mensaje de error COM. No totalmente inesperado, WinRT está muy basado. Lo que dice el mensaje de error es que se está utilizando un puntero de interfaz que se creó en un hilo se está utilizando en otro hilo sin haber sido modificado.

Esto es algo que normalmente tiene que hacer usted mismo cuando escribe el código COM RAW. La función de ayudante de com subyacente es el alegre llamado comarshalinterthreadinterfaceinstream (). Sin embargo, usted está utilizando claramente el código administrado. Es el trabajo de CLR en los puntos de mariscal cuando sea necesario. Lo ha hecho de manera confiable y consistente hasta .NET versión 1.0, nunca he visto un caso en el que hurgó.

Este insinúa firmemente a un error en la plomería C # AWAIT / Async o la proyección WinRT de CLR. Especialmente, ya que es espurio, este tipo de error de mariscalización debería ser consistente. Nada que puedas arreglarte. Use el portal Connect.Microsoft.com para informar el error, necesitarán un pequeño proyecto Repro que demuestre el problema.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top