【问题标题】:Return from long running Task to suspended/terminated app从长时间运行的任务返回到暂停/终止的应用程序
【发布时间】:2015-11-09 10:54:27
【问题描述】:

我有一个需要在后台运行长时间任务的应用程序。与此同时,预计用户将使用其他应用程序开展业务。对于 Windows 商店应用程序 - 这可能意味着该应用程序将被暂停/终止。

我想通过Task.Run 在单独的线程中运行来处理实际长时间运行的任务。但这引发了将结果返回到 UI 的问题。

  1. 如果应用暂停 - 任务如何恢复应用?
  2. 如果应用程序被终止 - 这显然是一个问题 - 我必须 防止这种情况发生。

那么 - Windows 应用商店应用程序是否不适合任何此类应用程序?或者有什么办法可以解决这个挂起/终止问题?

【问题讨论】:

  • 您需要一个后台任务而不是主应用程序中的线程(可以暂停)。详细信息将取决于您的后台任务需要做什么。见msdn.microsoft.com/en-us/library/windows/apps/mt299103.aspx
  • @RobCaplan-MSFT 谢谢。但是后台任务可以消耗多少 cpu 时间是非常有限的,不是吗?

标签: c# .net windows-runtime windows-store-apps win-universal-app


【解决方案1】:

任务如何恢复应用程序?

任务从暂停的地方继续运行。

如果应用程序被终止 - 这显然是一个问题 - 我必须 防止这种情况发生。

你无法阻止应用终止,你只需要适应它,否则,它确实是一个问题。

您的任务需要了解应用的生命周期。您应该将代码包装到一个类中来处理挂起和终止事件,而不是仅仅通过 Task.Run 运行您的代码。这意味着您的任务应该是可暂停的,并且还需要能够保持其状态以处理应用程序终止。

也许这个伪代码给了你一个想法:

class LongRunningTask {
    private void LongRunningJob() {
        // Do some long running job
        // Implement cancellation/pause token
    }        
    public async Task StartAsync(IState state) {
        // Load previous state
        // Start LongRunningJob()
    }
    public async Task<IState> SuspendAsync() {
        // Stop LongRunningJob() using a token
        // Return current state, in case of termination
    }
    public async Task ResumeAsync() {
       // Resume LongRunningJob using a token
    }
}

在应用程序中:

private async override void OnLaunched(LaunchActivatedEventArgs e) {
    // Check launch reason first
    // Read state from the disk
    await longRunningTask.StartAsyc(state);        
}
private async void OnResuming(object sender, object e) {
    await longRunningTask.ResumeAsync();        
}
private async void OnSuspending(object sender, SuspendingEventArgs e) {
    await longRunningTask.SuspendAsync();     
}

我知道这看起来根本不是一个干净的方法,但考虑到应用程序不能禁止它的生命周期这一事实,我认为没有干净的方法可以做到这一点。

编辑:根据您的代码正在做什么,您可能不需要关心暂停,因为恢复后代码会继续自动运行,但您显然需要处理应用程序终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2020-11-15
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多