我在尝试通过“appFolder.GetFilesAsync();”读取文件列表时遇到错误

时间:2016-01-31 23:02:27

标签: c# uwp storagefile windowsiot

我一直关注输出到Debug.Window。

Der Thread 0xd88 hat mit Code 0 (0x0) geendet.
Der Thread 0x6fc hat mit Code 0 (0x0) geendet.
Der Thread 0xce8 hat mit Code 0 (0x0) geendet.
Der Thread 0x68c hat mit Code 0 (0x0) geendet.

我的代码是:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.UI.Xaml.Controls;

namespace WindowsIOTControlCenter.ImageRotation
{
class ImageRotation
{

    Timer _time;
    IReadOnlyList<StorageFile> pictures;

    public ImageRotation(Grid targetGrid)
    {
       pictures = scanImagesFolder().Result;
    }

    private async Task<IReadOnlyList<StorageFile>> scanImagesFolder()
    {
        try
        {
            StorageFolder appFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("ImageRotation\\BackgroundImages");

            IReadOnlyList<StorageFile> filesInFolder = await appFolder.GetFilesAsync();

            foreach (StorageFile file in filesInFolder)
                Debug.WriteLine(file.Name + ", " + file.DateCreated);
            return null;
        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return null;
        }
    }

}
}

我在inet中使用了一个非常基本的示例,因为我的原始代码在此示例中遇到了同样的问题。

我基本上想要一个位于指定目录中的文件列表。

逐步调试显示将目录分配给appFolder没有问题。

但是谈到

IReadOnlyList<StorageFile> filesInFolder = await appFolder.GetFilesAsync();

上面提到的输出逐步退出。很明显没有异常捕获,否则它将继续捕获(Exception ex)。

有谁知道我做错了什么或者能指出我问题的另一个解决方案?

任何提示都是相关的。

P.S。:对不起我糟糕的英语。

2 个答案:

答案 0 :(得分:2)

错误的翻译是&#34; 线程0xd88以代码0(0x0)&#34;结束。这不是错误,此消息对于程序来说是正常的。

执行pictures = scanImagesFolder().Result;后,通过在使用.Result的任务上调用await,您可能会导致程序死锁。

你可以做的一些事情。

  1. 使用filesInFolder = await appFolder.GetFilesAsync().ConfigureAwait(false);,这使得它不再尝试在UI线程上运行其余代码,因此调用.Result 不太可能 < / strong>陷入僵局。如果GetFilesAsync也没有使用.ConfigureAwait(false),您仍然可以死锁。
  2. 将您的代码移出构造函数并在您的方法上使用await而不是.Result

    class ImageRotation
    {
    
        Timer _time;
        IReadOnlyList<StorageFile> pictures;
    
        public ImageRotation(Grid targetGrid)
        {
        };
    
        public async Task LoadImages()
        {
           pictures = await scanImagesFolder();
        }
    

    如果需要,这将使pictures =在相同的上下文中。如果您不需要该功能,请使用

        public async Task LoadImages()
        {
           pictures = await scanImagesFolder().ConfigureAwait(false);
        }
    
  3. 请阅读&#34; Async/Await - Best Practices in Asynchronous Programming&#34;,它会告诉您基本知识,例如不致电.Result并避免async void

答案 1 :(得分:0)

尝试这样做: appFolder.GetFilesAsync()。ConfigureAwait(假)