我似乎无法从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)
是否可以访问文件后台任务?如果是的话,我哪里错了?
答案 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)异步读取文件,所以我不确定你为什么决定编写自己的文件。