Есть объект у закрытой библиотеке, на событие которого я подписываюсь, но оно возникает в основном потоке. И поэтому я не могу использовать 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> и когда его лучше использовать?
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости