Есть объект у закрытой библиотеке, на событие которого я подписываюсь, но оно возникает в основном потоке. И поэтому я не могу использовать AutoResetEvent
, потому что в одном и том же потоке всё работает. А как можно реализовать так, чтобы событие возникало в новом потоке?
listenerPrice.Handler += new Listener.MessageHandler(MessageHandlerClientPrice);
Обработчик будет вызван в том потоке, где его вызывает отправитель события — в вашем случае, в главном потоке. Это обойти невозможно.
Вы можете, однако, получив событие, перебросить обработку в другой поток. Например, через Task.Run
.
Для вашего случая:
// начало
// инициировать действие
// дождаться event'а
// конец
нужно переписать код в таком виде:
Listener.MessageHandler h = null;
h = (args) =>
{
listenerPrice.Handler -= h;
// конец
};
// начало
listenerPrice.Handler += h;
// инициировать действие
Ещё более хороший вариант — перейти на async/await. При этом ваш код будет таким:
// начало
// инициировать действие
await CallbackReceived();
// конец
Метод CallbackReceived
можно имплементировать, например, как описано здесь: В чем смысл TaskCompletionSource<T> и когда его лучше использовать?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
При использование в с# при технологии entity framework подход database first возникает проблема при подключение к objectdatasource модели данных возникает проблема...
Пытаюсь решить проблему с созданием массива объектов по данным из формЭто будет необходимо для программы создания графиков
Есть радио инпутВозможно ли по клику на этот инпут менять checked? Если у кого то есть готовое решение, прошу поделиться! Пытался что то вроде...