如何从后台任务在主应用程序上执行功能

Posted

技术标签:

【中文标题】如何从后台任务在主应用程序上执行功能【英文标题】:How to execute a function on the main app from a background task 【发布时间】:2019-04-23 12:19:08 【问题描述】:

我目前正在开发一个 HMI,它必须连接到同一网络上的远程服务器才能启动。为此,我使用了 UWP 平台的闪屏功能,该功能允许我模拟加载页面。

我的问题是我必须从服务器接收到“开始”这个词才能解锁我的启动屏幕并传递应用程序。

所以我尝试直接从我的后台调用这个函数,但它不可避免地不起作用。

退出闪屏的函数:

void DismissedEventHandler(SplashScreen sender, object e)

    dismissed = true;


public void DismissExtendedSplash()

    rootFrame.Navigate(typeof(MainPage));
    Window.Current.Content = rootFrame;


void DismissSplashButton_Click(object sender, RoutedEventArgs e)

    DismissExtendedSplash();

SocketActivtyTask:

case SocketActivityTriggerReason.SocketActivity:
   var socket = socketInformation.StreamSocket;
   DataReader reader = new DataReader(socket.InputStream);
   reader.InputStreamOptions = InputStreamOptions.Partial;
   await reader.LoadAsync(250);
   var dataString = reader.ReadString(reader.UnconsumedBufferLength);

   try
   
      if (dataString.Equals("Start"))
      
          Debug.WriteLine("Lancement OK.");
          DismissExtendedSplash();
      
    
    catch
    
          Debug.WriteLine("Lancement FAIL.");
    
   

我怎样才能让它工作?

另外一个问题,关闭应用时如何取消后台任务?

【问题讨论】:

你是如何配置你的后台任务的?您是否将其配置为在单独的进程中运行? (可能,因为这是大多数人所做的。)如果您这样做,那么当您调用DismissExtendedSplash 时,您不会调用前台进程。但是为什么要使用后台任务呢?让前台任务监听套接字。 我使用后台任务,因为在我的主程序之后我需要从服务器接收信息。我需要接收消息,然后进行某种切换以在我的主程序中执行不同的任务。 我的建议是让前台进程在启动时从套接字代理接管套接字。然后一切都在一个过程中。 (或者,您可以将后台任务配置为与前台应用程序在同一进程中运行。) 【参考方案1】:

永远不要执行任何占用应用程序线程时间的任务。这是将性能问题(最好的情况)或死锁(最坏的情况)引入应用程序的可靠方法。对于需要时间的任务,请使用BackgroundWorker。任务完成后,使用 RunWorkerCompleted 事件处理程序更新应用程序的 UI。

下面是一个相对简单的实现BackgroundWorker类的例子: https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

【讨论】:

您好,感谢您的回复,但我认为它不适用于 UWP 平台,它是一个 Windows 窗体示例。我的应用程序没有被阻止等待答案,稍后在主菜单中我也期待简单的消息。不能只返回接收到的值或进行切换以执行不同的功能吗?【参考方案2】:

我认为在您的情况下,您应该使用我们所说的 BackgroundTask 作为最佳实践。为此,您需要首先在应用程序中实现 IBackgroundTask,这将允许您触发特定事件。

MSDN 链接https://docs.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task

【讨论】:

是的,我的应用程序中已经有一个后台任务。我再仔细看看触发函数。

以上是关于如何从后台任务在主应用程序上执行功能的主要内容,如果未能解决你的问题,请参考以下文章

如何让iOS设备上App定时执行后台任务(下)

如何让iOS设备上App定时执行后台任务(下)

如何让iOS设备上App定时执行后台任务(上)

如何让iOS设备上App定时执行后台任务(上)

Android 后台任务执行

为啥我从后台工作人员调用的委托在主线程中运行