在Windows 8 Metro应用中的后台任务中运行时,Client.GetAsync似乎失败了。
我尝试使用TimeTrigger和MaintenanceTrigger。似乎没有例外。在调试它时,它只是退出该行(如果我继续按下一步),即使有更多的执行方式以及围绕它的try-catch。
这让我相信Windows正在取消我的任务。所以我没有运气听取了被取消的活动。
我已将Internet访问权限声明为功能,并且该任务已正确注册。此外,我的应用程序具有完全锁定屏幕访问权限。
我做错了什么?
这是我目前用于注册后台任务的代码。
if (await ObtainLockScreenAccess())
{
const string name = "Task";
var updaterTasks = BackgroundTaskRegistration.AllTasks.Where(t => t.Value.Name == name);
if (!updaterTasks.Any())
{
var builder = new BackgroundTaskBuilder();
builder.Name = name;
builder.TaskEntryPoint = "Stackstabilizer.BackgroundTasks.UpdateBackgroundTask";
var trigger = new MaintenanceTrigger(15, false);
var condition = new SystemCondition(SystemConditionType.InternetAvailable);
builder.AddCondition(condition);
builder.SetTrigger(trigger);
var task = builder.Register();
Debug.WriteLine("Task has been registered");
}
}
编辑以下是后台任务签名:
namespace Stackstabilizer.BackgroundTasks
{
// You must use a sealed class, and make sure the output is a WINMD.
public sealed class UpdateBackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var deferral = taskInstance.GetDeferral();
try { ... } finally { deferral.Complete(); }
}
}
}
以下是我的声明的一些细节。
答案 0 :(得分:2)
我之前遇到过类似的问题,我解决它的方法是在异步任务中再次推迟。我认为这个想法是,每当你有一个异步任务时,你需要推迟。 (我不确定这是不是最佳做法,但嘿,它有效)
代码:
public void Run(IBackgroundTaskInstance taskInstance)
{
updateAllTiles(taskInstance);
}
public async void updateAllTiles(IBackgroundTaskInstance taskInstance)
{
// Need to use a deferral to run async tasks in the background task
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
dosomething(taskInstance);
deferral.Complete();
}
private async void dosomething(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
HttpClient client = new HttpClient();
HttpResponseMessage resp = await client.GetAsync(new Uri(url));
updateTile(resp);
deferral.Complete();
}