![](/img/trans.png)
[英]How to run multiple tasks simultaneously in the background of a IHostedService
[英]How to make 2 tasks run simultaneously in a UWP background app?
我需要帮助来运行部署在我的 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();
}
}
这两个任务可以同时在后台应用程序中运行。
是线程冲突的问题吗?
如果两个任务之间没有提交或共享数据,则不会有冲突。 重要的是你需要注意数据的同步。 如果使用列表或队列在两个线程之间共享数据,则应使用并发对象。 请参考ConcurrentQueue示例,ConcurrentQueue 代表线程安全。
树莓上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)?
一旦部署和配置了后台应用程序,这些应用程序将在机器启动时启动并持续运行,而没有任何进程生命周期管理资源使用限制。 后台任务有一些限制,但不限于单线程。 更多信息在这里。 这里需要区分 Windows IoT Core 上的后台应用程序和任务。
是否所有类都需要“密封”(microsofts 的文档是这样说的,但不是他们提供的示例)?
是的,后台任务类本身——以及后台任务项目中的所有其他类——需要是密封(或最终)的公共类。 它适用于从接口IBackgroundTask继承的后台任务,但不适用于普通线程使用的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.