【问题标题】:How do I handle BackgroundTask.Completed event [duplicate]如何处理 BackgroundTask.Completed 事件 [重复]
【发布时间】:2021-04-21 14:22:16
【问题描述】:

我正在处理一个 UWP 项目,最近我向它添加了一个进程外后台任务。我在App.csOnLaunched() 方法中注册了任务,以便仅在启动应用程序后运行任务。但是有一个问题:任务完成后我必须刷新我的xaml视图,我完全不知道如何实现(如果我将任务的注册移动到Main.xaml.cs,它将每次运行页面打开)。 我很乐意从你那里得到任何帮助。 这是我在OnLaunched() 方法中调用的StartBackgroundTask() 方法:

private async void StartBackgroundTask()
    {
        var task = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(x => x.Name == "testTask");
        if (task != null)
        {
            task.Unregister(true);
        }

        var taskBuilder = new BackgroundTaskBuilder();
        taskBuilder.Name = "testTask";
        taskBuilder.TaskEntryPoint = typeof(UpdateLocalDbBackgroundTask.UpdateLocalDbBackgroundTask).ToString();

        ApplicationTrigger trigger = new ApplicationTrigger();

        taskBuilder.SetTrigger(trigger);
        taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
        task = taskBuilder.Register();            

        await trigger.RequestAsync();
    }

【问题讨论】:

  • 可能不是你要找的东西,所以我不会把它作为答案,但你可以在你的项目中添加一个公共静态布尔值并将其设置为 true默认。然后在注册任务之前,检查 bool 是否为真(默认情况下在启动时为真)。一旦你注册了你的任务,就将它设置为 false,这样它就不会再运行了。全局类/变量使用示例:social.msdn.microsoft.com/Forums/windowsapps/en-US/…
  • 我喜欢这个主意,例如,您也可以使用 ApplicationData.Current.LocalSettings.Values 字典,然后在 MainPage 上使用异步方法检查您在完成后设置的值是否有变化App.cs中的更新方法。
  • 关于如何正确使用BackgroundWorker的详细信息可以在重复问题的答案中找到,包括如何使用处理程序订阅RunWorkerCompleted事件。当然,文档也有丰富的信息。如果在查看了这些可用的参考资料后您仍然有问题,请随时发布一个问题,其中包括正确的minimal reproducible example,并详细说明该代码的作用、与您想要的有何不同以及具体 你需要帮助。

标签: c# uwp


【解决方案1】:

您可以在 App.cs 上创建一个事件并在目标 XAML 页面中处理它。假设它是MainPage。注册后台任务后就可以调用事件了。

这是一个非常简单的代码示例:

App.cs

    public static event Action<String> TaskCompleted;

    public App()
    {
        this.InitializeComponent();
        this.Suspending += OnSuspending;
    }


    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
        Frame rootFrame = Window.Current.Content as Frame;
        //some other code
         Window.Current.Activate();
        }

        App.TaskCompleted?.Invoke("Task Complete");

    }

MainPage.cs

    public MainPage()
    {
        this.InitializeComponent();

        App.TaskCompleted += App_TaskCompleted;
    }

    private void App_TaskCompleted(string obj)
    {
        Debug.WriteLine(obj);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2012-09-12
    • 2010-11-24
    • 2013-07-04
    • 1970-01-01
    • 2014-08-26
    • 2016-07-05
    相关资源
    最近更新 更多