Вопрос

У меня есть некоторые проблемы, когда я получаю доступ к файлам в WinRT

Вопрос 1:

var file = await StorageFile.GetFileFromPathAsync(filePath);
.

Иногда getfilefromathasync бросит "сервер 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:

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

Иногда он будет выбрасывать исключение:

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

Эти исключения не будут брошены все время, но иногда.Почему?

Это было полезно?

Решение

Это такая проблема, вызываемая резьбой, это сообщение об ошибке COM. Не совсем неожиданный, WinRT находится в тяжелом порядке. Что говорит сообщение об ошибке, заключается в том, что указатель интерфейса, который был создан на одном потоке, используется в другой поток без маршал.

Это то, что вы обычно должны делать себе, когда вы пишете RAW COM-код. Основная функция COM HELPER - радостно называемая ComarshalinterTreadInterFaceInstream (). Однако вы четко используете управляемый код. Это работа CLR для маршаловных указателей, где это необходимо. Это сделало так надежно и последовательно вернуться к .NET версии 1.0, я никогда не видел случай, когда он наступил.

Это очень сильно подсказки к ошибке в одном из C # a ждать / асинхронизации или проекция WinRT CLR. Особенно так, как оно ложно, этот вид маршалинга должен быть последовательным. Ничего не сможешь исправить себя. Используйте Portal Connect.microsoft.com, чтобы сообщить об ошибке, им понадобится небольшой проект REPRO, который демонстрирует проблему.

Единственный обходной путь, который вы имеете в наличии прямо сейчас - это тщательно контролировать резьбу в вашем приложении. Избегайте этого Mishap, используя только объект в том же потоке, который вы создали его. Это не совсем гарантия, которую вы увидите ошибку. В противном случае головная боль, которую вы можете ожидать, когда вы пытаетесь использовать предварительный бета-код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top