2009-07-31 3 views
1

Le code suivant renvoie une exception ...Silverlight 3 IncreaseQuotaTo échoue si j'appelle AvailableFreeSpace premier

private void EnsureDiskSpace() 
{ 
    using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForSite()) 
    { 
     const long NEEDED = 1024 * 1024 * 100; 

     if (file.AvailableFreeSpace < NEEDED) 
     { 
      if (!file.IncreaseQuotaTo(NEEDED)) 
      { 
       throw new Exception(); 
      } 
     } 
    } 
} 

Mais ce code ne (il affiche le "quota d'augmentation" silverlight de dialogue) ...

private void EnsureDiskSpace() 
{ 
    using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForSite()) 
    { 
     const long NEEDED = 1024 * 1024 * 100; 

     if (file.Quota < NEEDED) 
     { 
      if (!file.IncreaseQuotaTo(NEEDED)) 
      { 
       throw new Exception(); 
      } 
     } 
    } 
} 

La seule différence dans le code est que le premier vérifie file.AvailableFreeSpace et le second vérifie file.Quota.

N'êtes-vous pas autorisé (e) à vérifier l'espace disponible avant d'en demander plus? Il semble que j'ai vu quelques exemples sur le web qui testent l'espace disponible en premier. Est-ce que ce n'est plus supporté dans SL3? Mon application permet aux utilisateurs de télécharger des fichiers à partir d'un serveur et de les stocker localement. Je voudrais vraiment augmenter le quota de 10% chaque fois que l'utilisateur est à court de sapce. Est-ce possible?

Répondre

0

Il s'avère que les deux blocs de code fonctionnent ... sauf si vous définissez un point d'arrêt. D'ailleurs, les deux blocs de code échouent si vous définissez un point d'arrêt.

0

Je crois qu'il y avait quelques changements au comportement dans Silverlight 3, mais n'ayant pas travaillé directement sur ces fonctionnalités, je ne suis pas complètement sûr.

J'ai jeté un oeil à ce MSDN page on the feature et l'approche recommandée est certainement le premier exemple que vous avez; ils suggère:

  1. Obtenez le magasin d'utilisateurs
  2. Vérifiez la propriété AvailableFreeSpace sur la boutique
  3. Si nécessaire, appelez IncreaseQuotaTo

Il n'est pas idéal, puisque vous ne pouvez pas implémentez votre propre algorithme de croissance (croissance de 10%, etc.), mais vous devriez au moins pouvoir débloquer votre scénario en utilisant la propriété AvailableFreeSpace, comme vous le dites. Je crois que la lecture de la quantité totale d'espace disponible (le quota) pour le magasin de l'utilisateur pourrait être en théorie un problème, imaginez un contrôle ou une application "voyous" qui veut simplement remplir tous les derniers octets qu'il peut dans le stockage isolé espace, ce qui oblige l'utilisateur à demander plus d'espace, même s'il n'est pas disponible.

1

Il y a un bug subtil dans votre premier exemple.

Il se peut qu'il n'y ait pas assez d'espace libre pour ajouter votre nouveau stockage, déclenchant la demande - mais le montant que vous demandez peut être inférieur au quota existant. Ceci lève l'exception et ne montre pas le dialogue.

La ligne correcte serait

file.IncreaseQuotaTo(file.Quota + NEEDED); 
4

J'ai eu le même problème. La solution pour moi était quelque chose d'écrit dans les fichiers d'aide. L'augmentation du quota de disque doit être initiée à partir d'une interaction de l'utilisateur telle qu'un événement de clic sur un bouton. Je demandais un quota de disque accru à partir d'un appel WCF asynchrone. En déplaçant la demande d'augmentation d'espace à un bouton, cliquez sur le code travaillé. Dans mon cas, si le WCF détecté il n'y avait pas assez d'espace, l'application Silverlight a informé l'utilisateur qu'ils avaient besoin d'augmenter l'espace en cliquant sur un bouton. Lorsque le bouton a été cliqué, et l'espace a été augmenté, j'ai appelé à nouveau le service WCF sachant que j'avais maintenant plus d'espace. Pas aussi bonne expérience utilisateur, mais ça m'a permis de dépasser ce problème.