从Windows应用商店应用中的后台任务进行文件访问

Car*_*pon 1 c# windows-runtime winrt-xaml winrt-async windows-store-apps

我似乎无法从Windows应用商店的后台任务中读取文件.这是读取文件内容的代码:

async private static Task<string> ReadAsync(string FileName)
{
    var folder = ApplicationData.Current.LocalFolder;
    var file = await folder.GetFileAsync(FileName);
    Windows.Storage.Streams.IRandomAccessStreamWithContentType inputStream = null;
    try
    {
        inputStream = await file.OpenReadAsync();
    }
    catch (Exception ex)
    {
        throw (ex);
    }
    string content = string.Empty;
    using (Stream stream = inputStream.AsStreamForRead())
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            try
            {
                // *** program exits on this line
                content = await Task.Run(() => reader.ReadToEnd());
            }
            catch(Exception ex)
            {
                // no error is caught
                content = ex.Message;
            }
        }
    }

    return content;
}
Run Code Online (Sandbox Code Playgroud)

程序退出在StreamReader上调用ReadToEnd()的行 - 在try catch块中没有捕获到错误.在输出窗口中,我得到:

程序'[8968] backgroundTaskHost.exe:Managed(v4.0.30319)'已退出,代码为1(0x1)

是否可以访问文件后台任务?如果是的话,我哪里错了?

Dam*_*Arh 7

如果您发布了IBackgroundTask代码,将会很有帮助.没有看到它,我怀疑你没有GetDeferral()在里面打电话,例如:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    var deferral = taskInstance.GetDeferral();
    var contents = await ReadAsync("MyFile.txt");
    deferral.Complete();
}
Run Code Online (Sandbox Code Playgroud)

GetDeferral()无论何时在后台任务中进行异步调用,都需要调用.这样就告诉运行时它需要等待异步调用完成,而不是在Run退出时立即停止后台任务.

一旦完成,即通常在Run方法结束时,您需要调用Complete()延迟实例以通知运行时您已完成.