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)
是否可以访问文件后台任务?如果是的话,我哪里错了?
如果您发布了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()延迟实例以通知运行时您已完成.