некоторое исключение при доступе к файлу в winrt - PullRequest
5 голосов
/ 25 февраля 2012

У меня проблемы с доступом к файлам в winrt

вопрос 1:

var file = await StorageFile.GetFileFromPathAsync(filePath);

иногда GetFileFromPathAsync генерирует исключение «сервер 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)).

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

1 Ответ

2 голосов
/ 25 февраля 2012

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

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

Это очень сильно указывает на ошибку в C # await / async илиWinRT проекция CLR.Тем более, что эта ошибка должна быть последовательной.Ничего, что ты можешь исправить сам.Воспользуйтесь порталом connect.microsoft.com, чтобы сообщить об ошибке, им потребуется небольшой репро-проект, который демонстрирует проблему.

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

...