0

我正在尝试在我的 C# W10 UWP 应用程序中将图像设置为锁屏或墙纸BackgroundTask......我可以在正常执行中很好地做到这一点,但是当我将相同的代码放入 aBackgroundTask时,代码会挂在StorageFile.CreateStreamedFileFromUriAsync.

// See if file exists already, if so, use it, else download it
StorageFile file = null;
try {
    file = await ApplicationData.Current.LocalFolder.GetFileAsync(name);
} catch (FileNotFoundException) {
    if (file == null) {
        Debug.WriteLine("Existing file not found... Downloading from web");

        file = await StorageFile.CreateStreamedFileFromUriAsync(name, uri, RandomAccessStreamReference.CreateFromUri(uri)); // hangs here!!
        file = await file.CopyAsync(ApplicationData.Current.LocalFolder);
    }
}

// Last fail-safe
if (file == null) {
    Debug.WriteLine("File was null -- error finding or downloading file...");
} else {
    // Now set image as wallpaper
    await UserProfilePersonalizationSettings.Current.TrySetLockScreenImageAsync(file);
}

有什么我不知道的StorageFile限制吗?BackgroundTasks一些谷歌搜索没有产生这样的限制......

有任何想法吗?

谢谢。

4

2 回答 2

1

“代码挂起”是什么意思?例外?开始操作但不会完成/返回?我有(或有,我仍在研究)一个类似的问题,或者至少我认为它是相似的。

也许这是一个异步配置上下文问题。

//not tested...but try ...AsTask().ConfigureAwait(false):
file = await StorageFile.CreateStreamedFileFromUriAsync(name, uri,    RandomAccessStreamReference.CreateFromUri(uri)).AsTask().ConfigureAwait(false);

编辑: 开始,但不会返回(下一行代码的断点未命中),听起来仍然像 SynchronizationContext/Deadlock 问题......嗯......

你检查过(或确保)CreateStreamedFileFromUriAsync真的完成了吗?

于 2015-09-23T05:55:12.123 回答
0

找到了!

正如@1ppCH 提到的,这听起来像是一个同步/死锁问题......所以我尝试让任务同步:

file = Task.Run(async () => {
    var _file = await StorageFile.CreateStreamedFileFromUriAsync(name, uri, RandomAccessStreamReference.CreateFromUri(uri));
    return await _file.CopyAsync(ApplicationData.Current.LocalFolder);
}).Result;

这似乎奏效了!

谢谢大家。

于 2015-09-23T06:45:53.427 回答