Windows 8 - 如何正确获取嵌套文件夹?

时间:2013-04-12 19:20:39

标签: c# windows asynchronous windows-8 windows-runtime

我有一个GridView绑定到一组对象,这些对象从磁盘加载图像。

当对象变得可见时,它们被放入堆栈中,并且图像将按顺序从堆栈中加载。

问题是GetFolderAsync()在包含对象的ScrollViewer停止滚动之前不会返回。

代码如下:

    public static async Task<StorageFolder> GetFileFolderAsync(String fileUrl)
    {
        try
        {
            string filePathRelative = DownloadedFilePaths.GetRelativeFilePathFromUrl(fileUrl);
            string[] words = filePathRelative.Split('\\');
            StorageFolder currentFolder = await DownloadedFilePaths.GetAppDownloadsFolder();
            for (int i = 0; (i < words.Length - 1); i++)
            {
                //this is where it "waits" for the scroll viewer to slow down/stop
                currentFolder = await currentFolder.GetFolderAsync(words[i]);
            }
            return currentFolder;
        }
        catch (Exception)
        {
            return null;
        }
    }

我已将它精确定位到获取包含图像的文件夹的那一行。这甚至是获取嵌套文件夹的正确方法吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用ConfigureAwait(false)在线程池线程上运行for循环:

public static async Task<StorageFolder> GetFileFolderAsync(String fileUrl)
{
    try
    {
        string filePathRelative = DownloadedFilePaths.GetRelativeFilePathFromUrl(fileUrl);
        string[] words = filePathRelative.Split('\\');
        // HERE added ConfigureAwait call
        StorageFolder currentFolder = await
            DownloadedFilePaths.GetAppDownloadsFolder().ConfigureAwait(false);
        // Code that follows ConfigureAwait(false) call will (usually) be 
        // scheduled on a background (non-UI) thread.
        for (int i = 0; (i < words.Length - 1); i++)
        {
            // should no longer be on the UI thread, 
            // so scrollviewer will no longer block
            currentFolder = await currentFolder.GetFolderAsync(words[i]);
        }
        return currentFolder;
    }
    catch (Exception)
    {
        return null;
    }
}

请注意,在上述情况下,由于在UI上没有完成任何工作,您可以使用ConfigureAwait(false)。例如,以下内容无效,因为在ConfigureAwait

之后存在与UI相关的调用
// HERE added ConfigureAwait call
StorageFolder currentFolder = await
    DownloadedFilePaths.GetAppDownloadsFolder().ConfigureAwait(false);
// Can fail because execution is possibly not on UI thread anymore:
myTextBox.Text = currentFolder.Path;

答案 1 :(得分:0)

事实证明我用来确定对象的可见性阻止UI线程的方法。

  

我有一个GridView绑定到一组对象,这些对象从磁盘加载图像。

     

当对象变得可见时将它们放到堆栈上,并且图像按顺序从堆栈中加载。

     

问题是GetFolderAsync()在包含对象的ScrollViewer停止滚动之前不会返回。