首页 > 解决方案 > 如何使 2 个任务在 UWP 后台应用程序中同时运行?

问题描述

我需要帮助来运行部署在 Raspberry Pi(托管 Windows 10 IOT Core)上的 UWP 后台应用程序。

它几乎可以工作,但我遇到了一个棘手的问题......让我解释一下:

该应用程序有 2 个功能:

如果单独执行,这两个功能都可以很好地工作,但我需要它们同时运行。我对 UWP 和 Raspberry 比较陌生,所以也许我缺少一些东西......

我坚持将项目分成两个独立的可部署任务,我相信它会起作用,但我需要网络服务器任务来控制(开始/暂停/停止)重复任务。

我认为他们之间的沟通是可行的(使用这种方式),但我在这里寻找最简单/最快的解决方案。

这是精简的代码(3个类在单独的文件中):

应用类:

public sealed class StartupTask : IBackgroundTask
{
    private static BackgroundTaskDeferral _Deferral = null;

    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        _Deferral = taskInstance.GetDeferral();

        var webserver = new WebServer();
        await ThreadPool.RunAsync(workItem => { webserver.Start(); });

        StartRepeatingTask();
    }
}

网络服务器类:

internal class WebServer
{
    private const uint BUFFER_SIZE = 8192;

    public async void Start()
    {
        var listener = new StreamSocketListener();
        await listener.BindServiceNameAsync("1537");

        listener.ConnectionReceived += async (sender, args) =>
        {
            // Do some stuff
            ...
            Processing.StopProcess();
        }
    }
}

加工类

public class Processing 
{
    private static Task myTask = null;
    private static CancellationTokenSource taskCancellation = new CancellationTokenSource();

    public static void StartRepeatingTask()
    {
        taskCancellation = new CancellationTokenSource();
        myTask = Task.Run(() => AutoProcess(), taskCancellation.Token);
    }

    public static void AutoProcess()
    {
        Process();

        myTask = Task.Delay(GetDelayToUse(DELAY_SET_LIST))
            .ContinueWith(t => AutoProcess(), taskCancellation.Token);
    }

    public static void Process()
    {
        // Do some other stuff
    }

    public static void StopProcess()
    {
        taskCancellation.Cancel();
    }
}

标签: c#uwpbackgroundraspberry-piwindows-iot-core-10

解决方案


这两个任务可以同时在后台应用程序中运行。

是线程冲突的问题吗?

如果两个任务之间没有提交或共享数据,则不会发生冲突。重要的是您需要注意数据的同步。如果使用列表或队列在两个线程之间共享数据,则应使用并发对象。请参考ConcurrentQueue示例,ConcurrentQueue 代表线程安全。

覆盆子上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)?

一旦部署和配置了后台应用程序,这些应用程序将在机器启动时启动并连续运行,而没有任何进程生命周期管理资源使用限制。后台任务有一些限制,但不限于单线程。更多信息在这里。这里需要区分 Windows IoT Core 上的后台应用程序和任务。

是否所有类都需要“密封”(微软的文档是这样说的,但他们提供的例子不是这样)?

是的,后台任务类本身——以及后台任务项目中的所有其他类——需要是密封的(或最终的)公共类。它适用于从接口IBackgroundTask继承的后台任务,但不适用于普通线程的类。


推荐阅读