C# 如何在UWP后台应用程序中同时运行两个任务?
我需要帮助运行部署在Raspberry Pi(托管Windows 10 IOT Core)上的UWP后台应用程序 它几乎起作用了,但我有一个棘手的问题。。。让我解释一下: 该应用程序有两个功能:C# 如何在UWP后台应用程序中同时运行两个任务?,c#,uwp,background,raspberry-pi,windows-iot-core-10,C#,Uwp,Background,Raspberry Pi,Windows Iot Core 10,我需要帮助运行部署在Raspberry Pi(托管Windows 10 IOT Core)上的UWP后台应用程序 它几乎起作用了,但我有一个棘手的问题。。。让我解释一下: 该应用程序有两个功能: 接收http请求并根据参数进行某些处理的Web服务器。(基于) 每X分钟执行一次的重复任务(X从10到60不等) 如果分开执行,这两个功能都很好,但我需要它们同时运行。我对UWP&Raspberry还不太熟悉,所以也许我错过了一些东西 这是一个线程冲突的问题吗 raspberry上的后台任务是否仅
- 接收http请求并根据参数进行某些处理的Web服务器。(基于)
- 每X分钟执行一次的重复任务(X从10到60不等)
- 这是一个线程冲突的问题吗
- raspberry上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)
- 是否所有类都需要“密封”(microsofts的文档这样说,但不是它们提供的示例)
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();
}
}
这两个任务可以在后台应用程序中同时运行 这是一个线程冲突的问题吗 如果两个任务之间没有提交或共享数据,则不会进行确认。重要的是,您需要注意数据的同步。如果使用列表或队列在两个线程之间共享数据,则应使用并发对象。请参阅示例,ConcurrentQueue表示线程安全 raspberry上的后台任务是否仅限于单个线程(因此 执行的第一个/最后一个流程(wins) 一旦部署和配置了后台应用程序,这些应用程序将在机器启动时启动,并在没有任何进程生命周期管理资源使用限制的情况下连续运行。后台任务有一些限制,但不限于单个线程。更多信息。在这里,您需要区分Windows IoT核心和任务上的差异 所有的类都需要“密封”吗(微软的文档这么说,但是 不是他们提供的例子吗
是的,后台任务类本身和后台任务项目中的所有其他类都需要是密封(或最终)的公共类。它适用于从interfaceIBackgroundTask继承的后台任务,但不适用于普通线程使用的类。如果我没有弄错的话:“Web服务器任务”和“重复任务”可以从同一后台应用程序启动,只有“StartupTask”必须是“公共密封的”。正确的?我就是这么做的,为什么两个任务不能同时工作呢?是的,你是对的。当错误任务开始运行时,您是否监视了异常?可能是某个异常导致任务退出,因此您可以看到这两个任务不能同时工作。@DonMadrino,我已经测试了代码,这两个任务同时工作。但我发现在方法AutoProcess中有一个递归调用。为什么这样做?我不确定递归调用过程中的内容是否会导致问题。通过一些尝试和错误禁用代码,我发现ReadBlock正在停止web服务器;我得出结论,垃圾收集器需要为它清除一些空间,因此它会杀死没有强引用的侦听器实例。因此,我将它添加到应用程序的属性(CoreApplication.properties.Add(“listener”,listener))中,从那以后,即使在几个小时后,它似乎也能按预期工作!我会试着跑更长的距离,看看它是否还能坚持。谢谢你的帮助!:-)