【发布时间】:2020-03-04 17:08:21
【问题描述】:
我需要帮助来运行部署在 Raspberry Pi(托管 Windows 10 IOT Core)上的 UWP 后台应用程序。
它几乎可以工作,但我遇到了一个棘手的问题......让我解释一下:
该应用有 2 个功能:
- 一个Web Server,接收http请求,根据参数做一些处理。 (基于this link)
- 每 X 分钟执行一次的重复任务(X 从 10 到 60 不等)。
如果单独执行,这两个功能都可以很好地工作,但我需要它们同时运行。我对 UWP 和 Raspberry 比较陌生,所以也许我缺少一些东西......
- 是线程冲突的问题吗?
- 覆盆子上的后台任务是否仅限于单个线程(因此第一个/最后一个执行的进程获胜)?
- 是否所有类都需要“密封”(微软的文档是这样说的,但他们提供的示例却没有)?
我坚持将项目分成两个独立的可部署任务,我相信它会起作用,但我需要网络服务器任务来控制(开始/暂停/停止)重复任务。
我认为他们之间的通信可能是可行的(使用this way),但我在这里寻找最简单/最快的解决方案。
这是精简后的代码(这 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();
}
}
Web 服务器类:
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# uwp background raspberry-pi windows-iot-core-10