2 votes

Windows 8 - Comment obtenir un dossier imbriqué correctement ?

J'ai un GridView lié à une collection d'objets qui chargent des images depuis le disque.

Les objets sont placés sur une pile lorsqu'ils deviennent visibles, et les images sont chargées de la pile de manière séquentielle.

Le problème est que GetFolderAsync() ne revient pas tant que le ScrollViewer contenant les objets n'a pas cessé de défiler.

Le code est le suivant :

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

J'ai localisé le problème à la ligne où il récupère le dossier qui contient l'image. Est-ce que c'est la bonne façon d'obtenir un dossier imbriqué ?

1voto

chue x Points 11202

Vous pouvez essayer d'utiliser ConfigureAwait(false) pour exécuter le for sur un fil du pool de fils :

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

Notez que dans le cas ci-dessus, étant donné qu'il n'y a pas de travail effectué sur l'interface utilisateur, vous POUVEZ utiliser ConfigureAwait(false) . Par exemple, l'exemple suivant ne fonctionnerait pas parce qu'il y a un appel lié à l'interface utilisateur après l'élément ConfigureAwait :

// 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;

0voto

greeklander Points 1

Il s'avère que la méthode que j'utilisais pour déterminer la visibilité de l'objet bloquait le thread de l'interface utilisateur.

J'ai un GridView lié à une collection d'objets qui chargent des images depuis le disque.

Les objets sont placés sur une pile lorsqu'ils deviennent visibles et les images sont chargées séquentiellement de la pile.

Le problème est que GetFolderAsync() ne revient pas tant que le ScrollViewer contenant les objets n'a pas cessé de défiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X