c# - 如何使 2 个任务在 UWP 后台应用程序中同时运行?
问题描述
我需要帮助来运行部署在 Raspberry Pi(托管 Windows 10 IOT Core)上的 UWP 后台应用程序。
它几乎可以工作,但我遇到了一个棘手的问题......让我解释一下:
该应用程序有 2 个功能:
- 一个Web Server,接收http请求,根据参数做一些处理。(基于此链接)
- 每 X 分钟执行一次的重复任务(X 从 10 到 60 不等)。
如果单独执行,这两个功能都可以很好地工作,但我需要它们同时运行。我对 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();
}
}
解决方案
这两个任务可以同时在后台应用程序中运行。
是线程冲突的问题吗?
如果两个任务之间没有提交或共享数据,则不会发生冲突。重要的是您需要注意数据的同步。如果使用列表或队列在两个线程之间共享数据,则应使用并发对象。请参考ConcurrentQueue示例,ConcurrentQueue 代表线程安全。
覆盆子上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)?
一旦部署和配置了后台应用程序,这些应用程序将在机器启动时启动并连续运行,而没有任何进程生命周期管理资源使用限制。后台任务有一些限制,但不限于单线程。更多信息在这里。这里需要区分 Windows IoT Core 上的后台应用程序和任务。
是否所有类都需要“密封”(微软的文档是这样说的,但他们提供的例子不是这样)?
是的,后台任务类本身——以及后台任务项目中的所有其他类——需要是密封的(或最终的)公共类。它适用于从接口IBackgroundTask继承的后台任务,但不适用于普通线程的类。
推荐阅读
- c# - 阻止 gtmetrix 网站连接我的网站
- node.js - 当我在苹果 m1 芯片上运行 nvm install 14 时,Clang 命令继续在终端中运行
- python - 用字典中的每个值检查每个值
- flutter - 为什么我的数据没有在实时数据库中使用 Http Patch 更新
- statistics - 为什么调整后的 R2 分数比 R2 分数表现更好?
- sql - 在单个表上递归选择或连接
- java - ElasticSearch 如何聚合“copy_to”字段
- facebook - Android Studio Webview 广告点击次数
- c# - 如何在 System.Web.Mvc 命名空间的 JsonValueProviderFactory 类中增加默认 MVC 模型绑定器的 JSON 最大长度
- android - 是否有任何用于 Android 的安装事件/跟踪的 Twitter API?