C# sous Win8, lecture dans un fichier binaire en asynchrone
Bonjour,
J'ai un petit souci sur la lecture d'un fichier binaire et l'utilisation des fonctions async.
Dans mon fichier, j'ai plusieurs images dont je connais l'offset et la taille. Je développe avec MVS Express 2012 RC sous Windows 8 (Release Preview).
Après qq recherches, je me sert des objets de Windows.Storage.
J'ai donc une fonction qui me renvoie un objet Task<BitmapImage>
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| async private Task<BitmapImage> GetImageAtPageAsync(int pageNumber)
{
BitmapImage bitmapImage = null;
if (pageNumber > 0 && pageNumber < this.pageInfoList.Count)
{
MZPage pageInfo = this.pageInfoList[pageNumber];
// Ouverture du fichier
StorageFile file = await StorageFile.GetFileFromPathAsync("my\path");
// reader du fichier du fichier
IInputStream inputStream = await file.OpenSequentialReadAsync();
DataReader reader = new DataReader(inputStream);
// On lit sur la longueur de la taille de l'image
await reader.LoadAsync(pageInfo.MiniImage.Size);
byte[] dataBytes = new byte[pageInfo.MiniImage.Size];
reader.ReadBytes(dataBytes);
// [!!!] WARNING : A première vue risque que d'une copie en trop. A revoire
InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
DataWriter dw = new DataWriter(ras.GetOutputStreamAt(0));
dw.WriteBytes(dataBytes);
await dw.StoreAsync();
bitmapImage = new BitmapImage();
bitmapImage.SetSource(ras);
reader.Dispose();
inputStream.Dispose();
}
else
{
// [!!!] TODO Error message
}
return bitmapImage;
} |
Je pense que cette fonction fonctionne correctement (je n'en suis pas sur). Mon problème vient de son appel. Je n'ai pas trouver comment exploiter l'objet Task<BitmapImage>. Et sur internet la doc et les exemples explicites sont rares. J'ai bien tenté des trucs comme :
Code:
1 2
| Task<BitmapImage> btTask = this.GetMiniImageImageAtPageAsync(pageNumber);
btImage = btTask.Result; |
Mais de temps en temps btTask.Result vaut null, ou bien, a l’exécution l'appli bloque sur await StorageFile.GetFileFromPathAsync(this.MZFilePath);.
La je patauge depuis deux jours. Est ce que qq a une idée de ce qui ne va pas? Ou sinon est-ce que pour le développement sur tablette Win8 en C#/Xaml on a toujours accès au classe non asynchodre (ex l'objet FileStream)? Je ne les ai pas trouvés.
Merci :)