如何从后台任务在主应用程序上执行功能
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
【讨论】:
是的,我的应用程序中已经有一个后台任务。我再仔细看看触发函数。以上是关于如何从后台任务在主应用程序上执行功能的主要内容,如果未能解决你的问题,请参考以下文章