Windows phone 8 Windows后台任务API异步函数问题

Windows phone 8 Windows后台任务API异步函数问题,windows-phone-8,windows-phone,windows-8.1,windows-phone-8.1,Windows Phone 8,Windows Phone,Windows 8.1,Windows Phone 8.1,我正在windows phone 8.1中使用计时器触发器后台任务API 我只是想了解这个API的基本知识 我有一个注册定时器触发后台任务的应用程序。每15分钟触发一次事件。我知道应用程序的入口点有一个名为RUN的函数 我正在尝试使用后台传输服务API上传一张简单的图片。因为这个API是异步的,所以我使用BackgroundTaskDeleral来确保后台任务API遵循异步操作 下面是我注意到的,当您将upload作为一个单独的函数并在RUN方法中调用它时,它会在大约10秒钟内关闭。但是,如果在

我正在windows phone 8.1中使用计时器触发器后台任务API

我只是想了解这个API的基本知识

我有一个注册定时器触发后台任务的应用程序。每15分钟触发一次事件。我知道应用程序的入口点有一个名为RUN的函数

我正在尝试使用后台传输服务API上传一张简单的图片。因为这个API是异步的,所以我使用BackgroundTaskDeleral来确保后台任务API遵循异步操作

下面是我注意到的,当您将upload作为一个单独的函数并在RUN方法中调用它时,它会在大约10秒钟内关闭。但是,如果在RUN函数本身中包含整个代码,它将持续大约10分钟

有什么方法可以覆盖此功能吗?或者你知道为什么会这样吗

public异步无效运行(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeleral _deleral=taskInstance.getDeleral();
//accessMediaUpload();
StorageFolder picfolder=KnownFolders.CameraRoll;
var x=wait picfolder.getfileasync();
var枚举器=x.GetEnumerator();
Debug.WriteLine(“文件数为:“+x.Count”);
while(枚举数.MoveNext())
{
var file=enumerator.Current;
BackgroundUploader uploader=新的BackgroundUploader();
SetRequestHeader(“Filename”,file.Name);
UploadOperation upload=uploader.CreateUpload(uri,文件);
等待上载。StartAsync();
//获取HTTP响应以查看上载结果
ResponseInformation response=upload.GetResponseInformation();
如果(response.StatusCode==200)
{
Debug.WriteLine(file.Name+“Uplaoded”);
}      
}
_延迟。完成();
}
上面显示的代码是RUN方法,它是后台任务的入口点。这里有一个名为accessMediaUpload()的注释函数。此函数只包含如上所示的将文件上载到服务器的代码


如果删除内联上载代码并取消对accessMediaUpload()的注释,后台任务将只运行几秒钟。但是上面的代码运行良好

我还没有尝试过这段代码,因为我现在还没有一个有效的示例。但据我所知,当您计划运行异步任务并在完成任务后调用
Complete()
时,应该使用Defferal

backgroundtaskderal\u deleral;
公共异步无效运行(IBackgroundTaskInstance taskInstance)
{
_延迟=taskInstance.getDeleral();
accessMediaUpload();
}
专用异步任务accessMediaUpload()
{
StorageFolder picfolder=KnownFolders.CameraRoll;
var x=wait picfolder.getfileasync();
var枚举器=x.GetEnumerator();
Debug.WriteLine(“文件数为:“+x.Count”);
while(枚举数.MoveNext())
{
var file=enumerator.Current;
BackgroundUploader uploader=新的BackgroundUploader();
SetRequestHeader(“Filename”,file.Name);
UploadOperation upload=uploader.CreateUpload(uri,文件);
等待上载。StartAsync();
//获取HTTP响应以查看上载结果
ResponseInformation response=upload.GetResponseInformation();
如果(response.StatusCode==200)
{
Debug.WriteLine(file.Name+“Uplaoded”);
}      
}
_延迟。完成();
}
几句话:

  • 请注意,在IMO中,您应该将您的
    \u deleral.Complete()
    进入
    try catch finally
    finally
    块,以确保即使出现异常也会调用它。正如MSDN所说

    务必小心完成所有获得的后台任务延期。在所有挂起的后台任务延迟完成之前,系统不会挂起或终止后台主机进程。未完成后台任务延迟会干扰系统管理进程生命周期的能力,并会导致资源泄漏

  • 上述方法可能需要改进,因为您可以分别为每个任务获取Defferal(如果有多个任务),并在任务结束时调用Complete。这应该允许您在所有异步任务完成时运行多个任务并完成整个
    后台任务
    (称为
    Complete()


我怀疑你读过。你能分享一个工作示例或代码吗?@Romasz我已经添加了我现在正在工作的示例代码!这段代码持续工作10分钟或10秒?这段代码持续运行10分钟。如果我从这里取出上载代码并取消对accessMediaUpload()函数的注释,它将只运行10秒钟。@golldy,再给我一点时间-我将在答案中添加一些注释。@Romasz:你能用一个例子解释你的最后一点吗?如如何为每个任务获得多个延期。你不会只是使用从taskInstance创建的相同延迟吗?@AbsoluteSith请阅读。