Избирательная нить в Блазоре - PullRequest
1 голос
/ 02 марта 2020

Я создаю приложение Blazor с REST API и веб-интерфейсом. У меня также будет контрольная часть приложения, которая каждую секунду будет опрашивать данные из множества различных источников данных. Я создал длительный поток в отдельном классе, который просто опрашивает нужные мне данные, и кажется, что он работает нормально. Шаблон приложения, который я использую, является серверным приложением Blazor ASP. NET. Просто вот так:

 m_pollThread = new Thread(new ThreadStart(PollThread))
 {
    IsBackground = true
 };
 m_pollThread.Start();

Что мне сейчас интересно, так это то, что в шаблонах программирования совершенно неправильно помещать потоки опроса такого типа в само приложение Blazor? Есть ли какие-то проблемы, которые могут привести к обратным последствиям (потребление памяти, производительность остальной части приложения)? Причина, по которой я спрашиваю, состоит в том, что, насколько мне известно, приложения Blazor и ASP. NET Core являются общими "по запросу" и просыпаются при получении запроса, а не выполняют длительные бесконечные задачи опроса. Я не знаю, смогу ли я запустить это в IIS, например.

Ответы [ 2 ]

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

Я построил нечто подобное для тестирования давления в трубопроводе, и я использовал только один таймер для чтения всех наших устройств в тесте.

Я не могу опубликовать класс, потому что он принадлежит моему последнему клиенту, но в основном я устанавливаю таймер для запуска каждые 30 секунд (30000 миллисекунд), поэтому он гарантированно будет работать по крайней мере один раз в минуту с этим кодом:

        public int Minute { get; set; }

        public bool NewMinute
        {
            get
            {
                // initial value
                bool newMinute = DateTime.Now.Minute != this.Minute;

                // return value
                return newMinute;
            }
        }

Затем в моем событии отметки таймера я делаю check

if (NewMinute)
{
    // store so I don't send again till the next minute
    Minute = DateTime.Now.Minute;

    // Get all temperature values
    GetTemperatureValues();
}

В моем методе GetTemperaValues ​​я вызываю некоторые последовательные библиотеки и получаю либо значение обратно, либо, если я не получаю ответ в течение 5 секунд, он выдает ошибку.

Не уверен, дает ли это вам какое-либо руководство, но оно работало там, где я работал, за исключением того, что они покупали самые дешевые устройства, и они выходили из строя слишком часто, но не код.

Теперь это было все сделано в Windows формах, Blazor - другое животное. Вы можете использовать Таймеры в Blazor, как и я, в своем компоненте Sprite для его анимации, и в этот пакет Nuget и пример проекта включен интерфейс подписчика:

https://github.com/DataJuggler/DataJuggler.Blazor.Components

А вот видео, которое идет с ним, если вам скучно: https://youtu.be/frtetHgfdIo

Blazor Animation Sample

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

совершенно неправильно в отношении шаблонов программирования помещать потоки опроса такого типа в само приложение Blazor?

Да. Это не сломается сразу, но это напрашивается на неприятности.

Решение простое, хотя ядро ​​ASP. NET позволяет очень легко запускать несколько потоков хоста .

Новый рабочий шаблон, вероятно, предпочтительнее сейчас, но все, что вам действительно нужно, это

class MyPollingService : BackgroundService { ... }

и

services.AddHostedService<MyPollingService>();

Ваша выгода - лучшая интеграция с каркасом и больше контроля над Start и Stop et c.

...