如果我先调用AvailableFreeSpace,Silverlight 3 IncreaseQuota会失败

时间:2009-07-31 05:25:06

标签: silverlight-3.0

以下代码抛出异常......

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();
            }
        }
    }
}

但是这段代码没有(它显示了silverlight“增加配额”对话框)......

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();
            }
        }
    }
}

代码中唯一的区别是第一个检查file.AvailableFreeSpace,第二个检查file.Quota。

在请求更多内容之前,您是否被允许检查可用空间?看起来我在网上看到了一些先测试可用空间的例子。 SL3中不再支持此功能吗?我的应用程序允许用户从服务器下载文件并在本地存储它们。每当用户用完sapce时,我真的想将配额增加10%。这可能吗?

4 个答案:

答案 0 :(得分:4)

我有同样的问题。我的解决方案是在帮助文件中编写的内容。必须从用户交互(例如按钮单击事件)启动磁盘配额的增加。我正在请求从异步WCF调用增加磁盘配额。通过将空间增加请求移动到按钮,单击已运行的代码。

在我的情况下,如果WCF检测到没有足够的空间,则si​​lverlight应用程序通知用户他们需要通过单击按钮来增加空间。当单击按钮,并且空间增加时,我再次调用WCF服务,因为我知道现在有更多空间。没有那么好的用户体验,但它让我超越了这个问题。

答案 1 :(得分:1)

你的第一个例子中有一个微妙的错误。

可能没有足够的可用空间来添加新存储空间,从而触发请求 - 但您要求的金额可能低于现有配额。这会抛出异常并且不显示对话框。

正确的行是

file.IncreaseQuotaTo(file.Quota + NEEDED);

答案 2 :(得分:0)

我相信Silverlight 3中的行为有一些变化,但没有直接使用这些功能,我不完全确定。

我确实看过这个MSDN page on the feature,推荐的方法绝对是你的第一个例子;他们建议:

  1. 获取用户商店
  2. 检查商店的AvailableFreeSpace属性
  3. 如果需要,请致电IncreaseQuotaTo
  4. 这并不理想,因为您无法实现自己的增长算法(增长10%等),但您应该能够使用AvailableFreeSpace属性至少取消阻止您的场景,就像您说的那样。 / p>

    我认为向用户商店读取可用总空间量(配额)在理论上可能是一个问题,想象一个“流氓”控件或应用程序,它只想填充它在隔离存储空间中的每个最后一个字节,即使不可用,也会迫使用户最终请求更多空间。

答案 3 :(得分:0)

事实证明两个代码块都有效...除非你设置一个断点。就此而言,如果设置了断点,则两个代码块都会失败。