У меня есть асинхронная задача в классе камеры, которая передает растровое изображение из потока RTSP в Picture Box в моем пользовательском интерфейсе.
Я использую Safe Fire and Forget, когда запускаю задачу потоковой передачи, чтобы продолжить работу с потоком пользовательского интерфейса.
Я не хочу, чтобы во всей форме присутствовали ожидания и асинхронность. , он стал неуправляемым и мешал другим потокам. Пользовательский интерфейс отзывчив и работает хорошо.
Теперь я подписываюсь на событие SnapShotTaken в классе Camera, когда хочу сделать снимок. Затем я вызываю функцию класса Camera, чтобы сообщить ей, что нужно начать делать снимок (устанавливая логическую переменную), а затем я хочу, чтобы поток пользовательского интерфейса ждал, пока событие не будет запущено в моей форме.
Я используя цикл с Thread.Sleep в пользовательском интерфейсе, который затем блокирует пользовательский интерфейс и класс камеры!
Как я могу дождаться обратного вызова и позволить классу камеры продолжить свою работу (что Я предполагал, что нахожусь в фоновом потоке, так как не ждал этого), чтобы подать мне сигнал, не блокируя работу класса Camera?
Вот код для подписки на класс Camera (ThisFormIPCamera ) из события нажатия кнопки
Код: Выделить всё
ThisFormIPCamera.SnaphotTaken += ThisFormIPCamera_RegSnaphotTaken;
ThisFormIPCamera.TakeSnapshot();
снять следующий полученный кадр и отправить его обратно мне.
Вот код TakeSnapshot в классе Camera, который просто устанавливает переменную, чтобы сообщить классу Camera
чтобы сделать следующий полученный кадр и отправить его обратно мне.
р>
Код: Выделить всё
public void TakeSnapshot()
{
_takeSnapshot = true;
}
Код: Выделить всё
int timeoutCounter = 0;
while (!RegPhotoTaken)
{
try
{
System.Threading.Thread.Sleep(200);
}
timeoutCounter++;
if (timeoutCounter > 50)
{
MessageBox.Show("Timeout", GlobalVars.APP_NAME, MessageBoxButtons.OK)
break;
}
}
Что я могу использовать? не позволит выполнить код пользовательского интерфейса, но разрешит выполнение задачи в классе камеры.
Спасибо!
Я попробовал запустить используя async и await для функций, которые содержат вызовы для подписки на событие в классе Camera, но это стало очень сложным во всей форме, и моя аналоговая камера давала проблемы.
Я пытался установить флаги, чтобы остановить работу других потоков , но мне хотелось бы более чистое решение, если это возможно.
Подробнее здесь: https://stackoverflow.com/questions/785 ... -not-allow