Как сделать так, чтобы 2 задачи выполнялись одновременно в фоновом приложении UWP? - PullRequest
2 голосов
/ 04 марта 2020

Мне нужна помощь в запуске моего фонового приложения UWP, развернутого на моем Raspberry Pi (хостинг Windows 10 IOT Core).

Это почти работает, но у меня возникла сложная проблема ... Позвольте мне объяснить:

Приложение имеет 2 функции:

  • Веб-сервер, который получает http-запросы и выполняет некоторую обработку в соответствии с параметрами. (на основе этой ссылки )
  • Повторяющаяся задача, которая выполняется каждые X минут (X варьируется от 10 до 60).

Обе функции работают хорошо, если выполняется отдельно, но мне нужно, чтобы они запускались одновременно. Я довольно новичок в UWP и Raspberry, так что, может быть, мне чего-то не хватает ...

  • Это вопрос о потоке?
  • Является ли фоновая задача для малины ограничено одним потоком (поэтому первый / последний выполненный процесс выигрывает)?
  • Все ли классы должны быть "запечатаны" (так говорит dos c в microsofts, но не в примере, который они предоставляют)?

Я думал о том, чтобы разделить проект на две независимые развертываемые задачи, и я верю, что это будет работать, но мне нужна задача веб-сервера для управления (START / PAUSE / STOP) повторяющейся задачей.

Я думаю, что связь между ними может быть осуществима (используя таким образом ), но я ищу самое простое / быстрое решение здесь.

Вот сокращенный код ( 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();
    }
}

1 Ответ

0 голосов
/ 05 марта 2020

Эти две задачи могут выполняться одновременно в фоновом приложении.

Является ли это конфликтом потоков?

Если нет никаких обязательств или общих данных между две задачи, не будет никакой конфильтации. Важно то, что вам нужно обратить внимание на синхронизацию данных. Если вы используете список или очередь для обмена данными между двумя потоками, вам следует использовать объект параллелизма. Пожалуйста, обратитесь к ConcurrentQueue примеру, ConcurrentQueue представляет потокобезопасный.

Является ли фоновая задача на малине ограниченной одним потоком (поэтому первый / последний выполненный процесс выигрывает) ?

После развертывания и настройки фоновых приложений эти приложения запускаются при запуске компьютера и работают непрерывно без каких-либо ограничений использования ресурсов управления временем жизни процесса. Существуют некоторые ограничения в отношении фоновой задачи, но она не ограничивается одним потоком. Больше информации здесь . Здесь необходимо различать фоновое приложение на Windows IoT Core и задачу.

Все ли классы должны быть «запечатаны» (так говорит до'ос 1030 * от microsofts, но не пример, который они предоставляют)?

Да, сам класс фоновой задачи - и все другие классы в проекте фоновой задачи - должны быть опубликованными c классами, которые запечатаны (или окончательны). Он применяется к фоновым задачам, которые унаследованы от интерфейса IBackgroundTask , но не к классам, используемым для нормального потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...