繁体   English   中英

如何在 UWP 后台应用程序中同时运行 2 个任务?

[英]How to make 2 tasks run simultaneously in a UWP background app?

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

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

该应用程序有2个功能:

  • 一个接收http请求并根据参数做一些处理的Web Server。 (基于此链接
  • 每 X 分钟执行一次重复任务(X 从 10 到 60)。

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

  • 是线程冲突的问题吗?
  • 树莓上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)?
  • 是否所有类都需要“密封”(microsofts 的文档是这样说的,但不是他们提供的示例)?

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

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

这是精简后的代码(这 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();
    }
}

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

是线程冲突的问题吗?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM