Можно ли запустить обработчик событий в другом потоке - PullRequest
0 голосов
/ 12 марта 2020

Я использую объект, который позволяет мне подписаться на события:

easyModbusTCPServer.holdingRegistersChanged += new EasyModbus.ModbusServer.HoldingRegistersChanged(RegistersChanged);

При каждом запуске этого события вызывается функция «RegistersChanged», которая запускает или останавливает некоторый «долго выполняющийся код» ( остановка происходит путем изменения логического «StopRunning» на «True»)

К сожалению, остановка «долго работающего кода» не работает. Я думаю, что так как "долго работающий код" занят в основном потоке, он блокирует обработчик событий "registersChanged" от достижения ....

Возможно ли, чтобы функция "RegistersChanged" вызывалась в другом поток, поэтому функция «RegistersChanged» по-прежнему вызывается, и «длительный код» в главном потоке может быть остановлен.


Вместо помещения обработчика событий в отдельный поток, я мог бы поместить длинный запуск кода в отдельном потоке, но, к сожалению, этот «долго работающий код» является сложным и требует взаимодействия со многими объектами, созданными в основном потоке ....

Не важно, что пользовательский интерфейс не может использоваться пока код работает.

Спасибо,

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Можно ли вызвать функцию "RegistersChanged" в другом потоке

Краткий ответ: Нет, если только вы не можете изменить этот код, который фактически вызывает событие. Тогда вы можете поднять его на другой поток. Обработчик события вызывается в том же потоке, где происходит событие.

Вы можете переключиться на другой поток, хотя первое, что делается внутри обработчика события RegistersChanged.

к сожалению это " долгосрочный код "сложен и требует связи со многими объектами, созданными в главном потоке ....

Тогда вам придется переписать его.

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

Не уверен, поможет ли это, но в моем примере проекта Blazor Image Gallery я регистрирую пользователя в другой теме, например:

using System.Threading;
using System.Threading.Tasks;

// create a new loginModel object
LoginModel loginModel = new LoginModel(EmailAddress, Password, StoredPasswordHash, OnLoginComplete);

// Start the ProcessLogin Thread
Thread thread = new Thread(ProcessLogin);
thread.IsBackground = true;
thread.Start(loginModel);

Тогда мой метод ProcessLogin выглядит следующим образом:

public static async void ProcessLogin(object data)
{
    // local
    LoginResponse loginResponse = null;

    // cast as a Loginmodel object
    LoginModel loginModel = data as LoginModel;

    // process login code removed

    // if the delegate exists
    if (NullHelper.Exists(loginModel.OnLoginComplete))
    {   
         // Call the delegate that the login has finished
         loginModel.OnLoginComplete(loginResponse);
    } 
}

Если вы хотите увидеть полную рабочую версию, вот пример проекта и видео:

Код: https://github.com/DataJuggler/BlazorImageGallery

Видео: Building Blazor Галерея изображений https://youtu.be/3xKXJQ4qThQ

Может быть, это даст вам некоторые идеи, не уверен, поможет ли это вам или нет.

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