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

时间:2012-11-14 05:02:55

标签: c# windows-runtime winrt-xaml windows-store-apps winrt-async

我似乎无法从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;
}

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

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

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

2 个答案:

答案 0 :(得分:7)

如果您发布了IBackgroundTask代码,将会很有帮助。没有看到它,我怀疑你没有在其中调用GetDeferral(),例如:

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

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

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

答案 1 :(得分:-1)

已经有系统类(DataReader)异步读取文件,所以我不确定你为什么决定编写自己的文件。