从长时间运行的任务返回到暂停/终止的应用程序

时间:2015-11-08 18:36:52

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

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

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

  1. 如果应用程序被暂停 - 任务如何恢复应用程序?
  2. 如果应用程序被终止 - 这显然是个问题 - 我必须这样做 防止这种情况。
  3. 那么 - Windows应用商店应用是否不适合任何此类应用?或者是否存在解决此暂停/终止问题的方法?

1 个答案:

答案 0 :(得分:0)

  

任务如何恢复应用程序?

任务继续从暂停的位置开始运行。

  

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

您无法阻止应用终止,您只需要对其进行调整,否则,确实存在问题。

您的任务需要了解应用程序生命周期。您不应该只通过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
    }
}

并在App中:

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();     
}

我知道它根本看起来并不干净,但考虑到应用程序无法禁止它的生命周期,我认为没有干净的方法。

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