Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解Windows Universal App(UWP)中的扩展执行会话_C#_.net_Windows_Mobile_Uwp - Fatal编程技术网

C# 了解Windows Universal App(UWP)中的扩展执行会话

C# 了解Windows Universal App(UWP)中的扩展执行会话,c#,.net,windows,mobile,uwp,C#,.net,Windows,Mobile,Uwp,我正在努力让扩展执行会话为我的Windows Universal应用程序工作 我试图实现的是以下场景。用户希望通过蓝牙将手机与设备连接。目前,每当屏幕关闭、来电或用户最小化应用程序时,连接就会失败,我们会在恢复时重新启动。我想为这个正在进行的连接启用扩展执行,这样即使最小化(挂起)应用程序也能继续工作 我想我需要ExtendedExecutionReason.Unspecified,因为它应该允许我的应用程序在挂起状态下运行10分钟(这对于我来说已经足够了)。但是,挂起时连接似乎总是失败(当我尝

我正在努力让扩展执行会话为我的Windows Universal应用程序工作

我试图实现的是以下场景。用户希望通过蓝牙将手机与设备连接。目前,每当屏幕关闭、来电或用户最小化应用程序时,连接就会失败,我们会在恢复时重新启动。我想为这个正在进行的连接启用扩展执行,这样即使最小化(挂起)应用程序也能继续工作

我想我需要
ExtendedExecutionReason.Unspecified
,因为它应该允许我的应用程序在挂起状态下运行10分钟(这对于我来说已经足够了)。但是,挂起时连接似乎总是失败(当我尝试使用VS的应用程序生命周期下拉列表从调试器更改我的应用程序的状态时,我会使用
ExtendedExecutionRevokedReason.SystemPolicy
撤销连接)。我已经为我的应用程序启用了所有电池和后台权限,但仍然不好

我的代码大致如下:

        ... (on begin connection)
        ClearExtendedExcecution();

        DisplayRequest dr = new DisplayRequest();
        var newSession = new ExtendedExecutionSession
        {
            Reason = ExtendedExecutionReason.Unspecified,
            Description = "Pair device"
        };
        newSession.Revoked += SessionRevoked;
        ExtendedExecutionResult result = await newSession.RequestExtensionAsync();

        dr.RequestActive();
        try
        {
            switch (result)
            {
                case ExtendedExecutionResult.Allowed:
                    m_extendedExecutionSession = newSession;
                    // DO WORK HERE
                    await ConnectDeviceAsync(token);
                    break;
                default:
                case ExtendedExecutionResult.Denied:
                    // fallback to request screen active if extended execution fails, but still do work
                    newSession.Dispose();
                    await ConnectDeviceAsync(token);
                    break;
            }
        }
        finally
        {
            dr.RequestRelease();
            ClearExtendedExcecution();
        }
        ... 


    private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
    {
        await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            switch (args.Reason)
            {
                case ExtendedExecutionRevokedReason.Resumed:
                    Logger.Debug("Extended execution revoked due to returning to foreground.");
                    break;

                case ExtendedExecutionRevokedReason.SystemPolicy:
                    Logger.Debug("Extended execution revoked due to system policy.");
                    break;
            }
        });
    }

    private void ClearExtendedExcecution()
    {
        if (m_extendedExecutionSession == null)
        {
            return;
        }

        m_extendedExecutionSession.Revoked -= SessionRevoked;
        m_extendedExecutionSession.Dispose();
        m_extendedExecutionSession = null;
    }
任何关于我做错了什么、如何准确使用扩展执行会话或如何调试应用程序生命周期(而不撤销系统策略)的提示都将不胜感激。谢谢

在本例中,VS中的“挂起”生命周期事件模拟了由于资源不足而导致的挂起,这就是为什么您会得到“SystemPolicy”的原因

如果在没有附加调试器的情况下运行应用程序,则将其最小化(桌面)或切换到另一个应用程序(电话),执行将继续,但是(!)当您恢复应用程序时,由于“已恢复”原因,会话将被撤销,您必须通过调用RequestExtensionAsync()方法再次启动会话


这项技术可确保您的执行在需要时一直处于活动状态。

以下是关于扩展执行的教程:

以下是扩展执行的示例集:


您是正确的,最好在应用程序处于运行状态时使用未指定的扩展执行或位置跟踪,而不是在挂起状态下保存数据。对于您的特定场景,听起来您正试图从Windows Phone继续与蓝牙设备通信。根据蓝牙设备是BLE还是更早,GattCharacteristicNotificationTrigger或RfCommConnectionTrigger可能是更好的选择。它们不要求你的应用程序在后台持续运行,而是在外围通信期间唤醒你的应用程序。Kiran在去年的构建会议上概述了不同类型的蓝牙触发器,这里提供了信息:

请尝试修改ExtendedExecutionReason。未指定为ExtendedExecutionReason.SavingData。是的,感谢您的解释。几天前我自己弄明白了。我很困惑,因为我发现了与这个问题相关的资源。大多数示例使用扩展执行来延长OnSuspended回调,从而允许它们保存一些状态。实际上,我需要它通过BLE来回交换信息。最后,我用祝酒和日志记录来弄清楚到底发生了什么。基本上,在撤销恢复时,您需要请求一个新会话。您还需要注意如何处理旧会话