Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在UWP后台应用程序中同时运行两个任务?_C#_Uwp_Background_Raspberry Pi_Windows Iot Core 10 - Fatal编程技术网

C# 如何在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上的后台任务是否仅

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

它几乎起作用了,但我有一个棘手的问题。。。让我解释一下:

该应用程序有两个功能:

  • 接收http请求并根据参数进行某些处理的Web服务器。(基于)
  • 每X分钟执行一次的重复任务(X从10到60不等)
如果分开执行,这两个功能都很好,但我需要它们同时运行。我对UWP&Raspberry还不太熟悉,所以也许我错过了一些东西

  • 这是一个线程冲突的问题吗
  • raspberry上的后台任务是否仅限于单个线程(因此执行的第一个/最后一个进程获胜)
  • 是否所有类都需要“密封”(microsofts的文档这样说,但不是它们提供的示例)
我考虑将项目拆分为两个独立的可部署任务,我相信这会奏效,但我需要webserver任务来控制(启动/暂停/停止)重复任务

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

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

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

这是一个线程冲突的问题吗

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

raspberry上的后台任务是否仅限于单个线程(因此 执行的第一个/最后一个流程(wins)

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

所有的类都需要“密封”吗(微软的文档这么说,但是 不是他们提供的例子吗


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

如果我没有弄错的话:“Web服务器任务”和“重复任务”可以从同一后台应用程序启动,只有“StartupTask”必须是“公共密封的”。正确的?我就是这么做的,为什么两个任务不能同时工作呢?是的,你是对的。当错误任务开始运行时,您是否监视了异常?可能是某个异常导致任务退出,因此您可以看到这两个任务不能同时工作。@DonMadrino,我已经测试了代码,这两个任务同时工作。但我发现在方法AutoProcess中有一个递归调用。为什么这样做?我不确定递归调用过程中的内容是否会导致问题。通过一些尝试和错误禁用代码,我发现ReadBlock正在停止web服务器;我得出结论,垃圾收集器需要为它清除一些空间,因此它会杀死没有强引用的侦听器实例。因此,我将它添加到应用程序的属性(CoreApplication.properties.Add(“listener”,listener))中,从那以后,即使在几个小时后,它似乎也能按预期工作!我会试着跑更长的距离,看看它是否还能坚持。谢谢你的帮助!:-)