Как обработать событие в другом потоке?

154
13 февраля 2018, 04:59

Есть объект у закрытой библиотеке, на событие которого я подписываюсь, но оно возникает в основном потоке. И поэтому я не могу использовать AutoResetEvent, потому что в одном и том же потоке всё работает. А как можно реализовать так, чтобы событие возникало в новом потоке?

listenerPrice.Handler += new Listener.MessageHandler(MessageHandlerClientPrice);
Answer 1

Обработчик будет вызван в том потоке, где его вызывает отправитель события — в вашем случае, в главном потоке. Это обойти невозможно.

Вы можете, однако, получив событие, перебросить обработку в другой поток. Например, через Task.Run.

Для вашего случая:

// начало
// инициировать действие
// дождаться event'а
// конец

нужно переписать код в таком виде:

Listener.MessageHandler h = null;
h = (args) =>
{
    listenerPrice.Handler -= h;
    // конец
};
// начало
listenerPrice.Handler += h;
// инициировать действие

Ещё более хороший вариант — перейти на async/await. При этом ваш код будет таким:

// начало
// инициировать действие
await CallbackReceived();
// конец

Метод CallbackReceived можно имплементировать, например, как описано здесь: В чем смысл TaskCompletionSource<T> и когда его лучше использовать?

READ ALSO
dbcontext был уже удален EF в с#

dbcontext был уже удален EF в с#

При использование в с# при технологии entity framework подход database first возникает проблема при подключение к objectdatasource модели данных возникает проблема...

148
Создание масива масивов из формы. Js. Jquery

Создание масива масивов из формы. Js. Jquery

Пытаюсь решить проблему с созданием массива объектов по данным из формЭто будет необходимо для программы создания графиков

238
Смена prop checked radio инпута по клику

Смена prop checked radio инпута по клику

Есть радио инпутВозможно ли по клику на этот инпут менять checked? Если у кого то есть готовое решение, прошу поделиться! Пытался что то вроде...

269