windows - 是否可以防止在 LOB UWP 桌面应用程序/后台任务中挂起?

标签 windows service uwp

我的任务是将 LOB 桌面应用程序从 .NET 4.5.2 移植到 Windows 10 UWP。在普通的 Win32 应用程序中,应用程序会一直运行,直到用户关闭应用程序(服务和应用程序)。但是在阅读 UWP 应用程序时,我发现所有文档都说没有办法阻止应用程序暂停(只是暂时的或直到超过配额)。我在移动设备/平板电脑上了解这一点,但在具有可用性能和功能的台式机上则不然。

这个问题的常见答案是使用“真实”服务器(通常是网络服务器)。但是我们的应用程序用于无法使用互联网的领域。所以我们需要服务器/服务在台式机上运行。

到目前为止,我发现的最佳选择是 UWP 应用程序,其内置后台任务要求延迟。但据我所知,这仍然不能保证暂停。只有一些模糊的信息,“你可能不会被暂停,因为它是一台桌面机器,在全局池中有很多资源”......

而且我不喜欢将 LOB 服务应用程序保留在 .NET 中,而将客户端保留在 UWP 中,因为它们共享许多无法在 .NET 和 UWP 之间重用的代码。

那么,对于是否可以防止在 Win10 桌面计算机上运行的服务类型 UWP 应用程序/任务挂起,是否有任何人得到明确的答案/引用?

最佳答案

类似uservoice已在 wpdev.uservoice.com 上提出,微软正在听取建议。强烈鼓励您对其进行投票、添加您的评论并对其进行监控。

我认为是否防止挂起应该由用户决定,但没有办法做到这一点。我同意,在某些特殊情况下,这是有道理的。

但目前 UWP 的应用程序生命周期对挂起状态非常清楚。在 Desktop 系列上,UWP 应用程序在最小化或 Windows 进入低功耗状态时暂停。

[更新]

您可能不知道的另一种可能的解决方案是 Windows 10 中引入的一项新功能 - Extended execution session .

目前没有关于此功能的官方示例,但您可以查看Jerry Nixon and Andy Wigley’s MVA session关于应用程序生命周期(#13)。和 here是该 session 的问答记录,您可以在其中找到示例代码。您可以下载 MVA session 中包含的 ppt,其中包含以下代码供您快速引用:

private async void OnSuspending(object sender, SuspendingEventArgs args)
{
    var deferral = e.SuspendingOperation.GetDeferral(); using (var session = new ExtendedExecutionSession { Reason = ExtendedExecutionReason.SavingData })
    {
        session.Description = "Upload Data";
        session.Revoked += (s, e) => { Log("Save incomplete"); }; try
        {
            if (await session.RequestExtensionAsync() == ExtendedExecutionResult.Denied)                 // takes 3 seconds
                UploadBasicData();
            else                 // takes 8 seconds
                await UploadDataAsync(session); Log("Save complete");
        }
        catch { Log("Save failed"); }
        finally { deferral.Complete(); }
    }
}

但正如 Jerry 所说,仍然不能保证它是 100% 可靠的。

关于windows - 是否可以防止在 LOB UWP 桌面应用程序/后台任务中挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934593/

相关文章:

c++ - 使用 GDI 在我的窗口周围绘制边框不起作用?

windows - 在 Apache Spark 中通过管道运行 Windows 批处理文件

windows - 如何仅使用 WaitForDebugEvent 系列函数来监视 UNHANDLED 异常?

java - event.source() 在 android 中返回 null

c# - 无法使用 UWP 在工具栏项目中显示按钮图标

linux - 64 位与 32 位平台的流行程度

c# - 在同一应用程序中启动两个 Windows 服务

azure - 通过 SSH 连接到 Azure 的 Kubernetes 托管主节点

c# - 使用UWP以AMR-NB编码捕获音频?

c# - UWP/C# 旋转 BMP