2012-02-25 12 views
5

内のファイルは、私はいくつかの問題がある場合:一部例外私はWinRTの中</p> <p>質問1ファイルにアクセスする際のアクセスWinRTの

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:

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

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

時にはそれが例外をスローします

これらの例外は常にスローされることはありませんが、ときどきスローされます。どうして?

答えて

2

スレッド化によって引き起こされる問題の種類は、COMエラーメッセージです。まったく予想外のことではありませんが、WinRTはCOMベースです。エラーメッセージは、あるスレッドで作成されたインターフェイスポインタが、マーシャリングされていない別のスレッドで使用されていることを示しています。

これは、通常、生のCOMコードを書き込むときに自分で行う必要があるものです。基底のCOMヘルパー関数は、うれしいCoMarshalInterThreadInterfaceInStream()です。しかし、あなたは管理コードを使用しています。必要に応じてポインタを整列化するのはCLRの仕事です。それは、.NETバージョン1.0まで、信頼性高く、常に一貫して行っています。私はそれが不安定なケースを見たことがありません。

これは、C#await/async配管またはCLRのWinRT投影のいずれかのバグを強く示唆しています。特にスプーリアスなので、この種のマーシャリングバグは一貫していなければなりません。あなた自身を修正することはできません。 connect.microsoft.comポータルを使用してバグを報告すると、問題を示す小さな再プロジェクトが必要になります。

今すぐ使用できる回避策は、アプリ内のスレッドを慎重に制御することです。作成した同じスレッドでオブジェクトを使用するだけで、このような事態を回避できます。これは、あなたがバグを回避することを保証するものではありません。それ以外の場合は、ベータ版前のコードを使用しようとすると頭痛を感じることがあります。

関連する問題