Domanda

Ho alcuni problemi quando ho accesso ai file in winrt

domanda 1:

var file = await StorageFile.GetFileFromPathAsync(filePath);

a volte il GetFileFromPathAsync genererà un "server rpc non disponibile" eccezione.

domanda 2:

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

a volte si genera un'eccezione:

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

domanda 3:

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

a volte, verrà generata un'eccezione:

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

Queste eccezioni non essere gettato tutto il tempo, ma a volte.Perché?

È stato utile?

Soluzione

È il tipo di problema che è indotta da threading, è un COM messaggio di errore.Non del tutto inaspettato, WinRT è fortemente basata su COM.Ciò che il messaggio di errore che dice è che un puntatore a un'interfaccia che è stato creato su un thread viene utilizzato su un altro thread senza che sia stato eseguito il marshalling.

Questo è qualcosa che è normalmente hanno a che fare da soli quando si scrive raw codice COM.Sottostante COM funzione di supporto è la gioia di nome CoMarshalInterThreadInterfaceInStream().Tuttavia, è chiaro che l'utilizzo di codice gestito.È il CLR di lavoro per maresciallo puntatori dove necessario.Lo ha fatto in modo affidabile e coerente di tutti .NET versione 1.0, non ho mai visto un caso in cui si frugò.

Questo fortemente suggerimenti per un bug o il C# attendono/async l'impianto idraulico o CLR WinRT di proiezione.Soprattutto perché si tratta di vario tipo, questo tipo di marshalling bug dovrebbe essere coerente.Niente che non si può risolvere se stessi.Utilizzare il connect.microsoft.com portale di segnalare il bug, avrà bisogno di un piccolo repro progetto che illustra il problema.

L'unica soluzione che si hanno a disposizione al momento è di controllare attentamente la filettatura nella tua app.Evitare questo inconveniente utilizzando solo l'oggetto del thread è stato creato.Questo non è esattamente una garanzia di eludere il bug.In caso contrario il tipo di mal di testa si può aspettare quando si tenta di utilizzare un codice pre-beta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top