Question

J'ai quelques problèmes lorsque j'accède à des fichiers dans winrt

question 1:

var file = await StorageFile.GetFileFromPathAsync(filePath);

Parfois, le GetFileFrompathasync lancera une exception "Le serveur RPC n'est pas disponible".

question 2:

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

Parfois, il lance une exception:

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

question 3:

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

Parfois, cela mettra une exception:

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

Ces exceptions ne seront pas jetées tout le temps, mais parfois. Pourquoi?

Était-ce utile?

La solution

C'est le type de problème induit par le thread, c'est un message d'erreur com. Pas entièrement inattendu, Winrt est fortement basé sur COM. Ce que le message d'erreur dit, c'est qu'un pointeur d'interface créé sur un thread est utilisé sur un autre thread sans avoir été rassemblé.

C'est quelque chose que vous devez normalement faire vous-même lorsque vous écrivez du code COM brut. La fonction COM Helper sous-jacente est la joyeusement nommée ComarshalIntthreadInterfaceInstream (). Cependant, vous utilisez clairement le code géré. C'est le travail du CLR de rassembler les pointeurs si nécessaire. Il l'a fait de manière fiable et cohérente jusqu'à .NET Version 1.0, je n'ai jamais vu de cas où il a échappé.

Cela fait très fortement laisse entendre un bug dans la plomberie C # Await / Async ou la projection WinRT du CLR. Surtout comme il est faux, ce type de bug de maréchalage devrait être cohérent. Rien de ce que vous pouvez réparer vous-même. Utilisez le portail connect.microsoft.com pour signaler le bogue, ils auront besoin d'un petit projet de repro qui démontre le problème.

La seule solution de contournement dont vous disposez actuellement est de contrôler soigneusement le threading de votre application. Évitez cet accident en utilisant uniquement l'objet sur le même fil que vous l'avez créé. Ce n'est pas exactement une garantie que vous échapperez au bug. Sinon, le type de maux de tête que vous pouvez vous attendre lorsque vous essayez d'utiliser du code pré-bêta.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top