Мне нужна помощь в запуске моего фонового приложения 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();
}
}