ExtendedExecutionForegroundSession : UWP :: 我惊慌失措

ExtendedExecutionForegroundSession : UWP :: I was panicked

使用 UWP 应用程序(仅限 SideLoaded), 我用串口开发了一个监控应用程序。

例子。我通过串行端口从传感器读取温度。 我想做 365 天 24 小时的监控。 该应用程序必须一直有效。没有暂停。

6个月

为了开发,我花了 6 个月.. 但是我的应用程序在最小化时停止了。哇。真的吗 ? 我很恐慌....我需要你的帮助。

在调试模式下,一切正常。 即使最小化,所有后台任务、等待任务都在不停地工作。 但发布模式 = 侧载应用程序已停止,尤其是设备 read/write.

我添加了下面的代码来避免这种情况。但这并没有解决问题。

// This is Caliburn.micro , UWP framework.
protected override async void OnLaunched(LaunchActivatedEventArgs e)
    {
        var newSession = new ExtendedExecutionForegroundSession();
        newSession.Reason = ExtendedExecutionForegroundReason.Unconstrained;
        newSession.Description = "Long Running Processing";
        newSession.Revoked += SessionRevoked;
        var result = await newSession.RequestExtensionAsync();
        switch (result)
        {
            case ExtendedExecutionForegroundResult.Allowed:
                    Debug.WriteLine($"ExtendedExecutionForegroundResult.Allowed");
                break;

            default:
            case ExtendedExecutionForegroundResult.Denied:
                Debug.WriteLine($"ExtendedExecutionForegroundResult.Denied");
                break;
        }


private void SessionRevoked(object sender, ExtendedExecutionForegroundRevokedEventArgs args)
    {
        Debug.WriteLine($"ExtendedExecutionForegroundResult :: SessionRevoked");
    }

并且,Package.appxmanifest 在这里。

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" 
     xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" 
     xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
     xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
     xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
    IgnorableNamespaces="uap mp rescap">
.....

<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="extendedBackgroundTaskTime"/>
<rescap:Capability Name="extendedExecutionUnconstrained"/>
<DeviceCapability Name="serialcommunication">
  <Device Id="any">
    <Function Type="name:serialPort" />
  </Device>
</DeviceCapability>
</Capabilities>
</Package>

这是其他信息。

请帮忙!

更新 1:

我尝试使用此代码..但一样。不工作...

var extendedExecutionSession = new ExtendedExecutionSession();
        extendedExecutionSession.Reason = ExtendedExecutionReason.Unspecified;
        var extendedExecutionResult = await extendedExecutionSession.RequestExtensionAsync();
        if (extendedExecutionResult != ExtendedExecutionResult.Allowed)
        {
            //extended execution session revoked
            extendedExecutionSession.Dispose();
            extendedExecutionSession = null;
        }

我应该使用哪个?

当附加 运行 调试器时,最小化的应用程序不会暂停,直到使用此按钮 从 VS 手动发送到此状态。因此,有可能一直以来,当您在调试模式下测试应用程序时,即使没有扩展执行权限,它也可以在最小化时正常工作。

因此,您首先要确定的是,您的应用实际上可以启动扩展执行会话。我看到您使用 Debug.WriteLine() 来输出扩展执行会话请求的结果,但这在发布模式下不起作用。除非您想使用一些第 3 方解决方案(因为 UWP 没有 System.Diagnostics.Trace)我建议发送祝酒辞:

    protected override async void OnLaunched(LaunchActivatedEventArgs e)
    {
        ...
        var result = await newSession.RequestExtensionAsync();
        switch (result)
        {
            case ExtendedExecutionForegroundResult.Allowed:
                ShowToast("Extended execution session request: allowed");
                break;

            default:
            case ExtendedExecutionForegroundResult.Denied:
                ShowToast("Extended execution session request: denied");
                break;
        }
        ...
    }

    private void SessionRevoked(object sender, ExtendedExecutionForegroundRevokedEventArgs args)
    {
        ShowToast("Extended execution session revoked: " + args.Reason.ToString());
    }

    private void ShowToast(string text)
    {
        var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
        var toastTextElements = toastXml.GetElementsByTagName("text");
        toastTextElements[0].InnerText = text;
        ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(toastXml));
    }

    // small delay in suspended deferral is needed to buy enough time to send toast from the revoked event
    private async void OnSuspending(object sender, SuspendingEventArgs e)
    {
        var deferral = e.SuspendingOperation.GetDeferral();
        await Task.Delay(3000);
        deferral.Complete();
    }

请使用在没有调试器的发布模式下检查扩展执行会话请求的结果更新您的问题,并提供有关其撤销的详细信息。

使用ExtendedExecutionForegroundSession.