1

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

是否可以通过后台任务访问文件?如果是这样,我哪里错了?

4

2 回答 2

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()deferral 实例以通知运行时您已完成。

于 2012-11-14T05:50:02.113 回答
-1

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

于 2014-05-13T12:52:46.010 回答