1

我一直在关注 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();

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

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

任何提示都值得赞赏。

PS:对不起我糟糕的英语。

4

2 回答 2

2

错误的翻译是“线程 0xd88 以代码 0 (0x0) 结尾”。这不是错误,这个消息对于程序来说是正常的。

当您这样做时,pictures = scanImagesFolder().Result;您可能会通过调用.Result使用await.

你可以做的几件事。

  1. 使用filesInFolder = await appFolder.GetFilesAsync().ConfigureAwait(false);,这使它不再尝试在 UI 线程上运行其余代码,因此调用.Result不太可能死锁。如果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);
        }
    

请阅读“ Async/Await - 异步编程最佳实践”,它将教您不调用.Result和避免等基础知识async void

于 2016-02-01T01:05:43.273 回答
0

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

于 2016-01-31T23:50:36.450 回答