Как вы синхронно ждете результатов события в C #? - PullRequest
0 голосов
/ 19 ноября 2018

Кажется, что в приложениях Windows в C # существует шаблон, при котором вы назначаете «обработчик» для события, и это событие запускается как побочный эффект отдельного вызова метода. Для примера

ocrEngine = new OcrEngine();
ocrEngine.OcrResults += new OcrResultsEventHandler(ocrEngine_MethodThatProcessesTheResultsOfOcr); 

Так, например, у вас есть механизм OCR (Оптическое распознавание символов), и вы хотите передать ему изображение и получить обратно некоторый текст. Однако в этом API я использую метод для передачи изображения, возвращающего int. т.е.

int result = ocEngine.ReadImage(image);

Это означает, что я выясняю, был ли процесс OCR успешным с int, то есть 0 = success. Однако фактические результаты возвращаются в методе 'ocrEngine_MethodThatProcessesTheResultsOfOcr'.

Если я запускаю это из консольного приложения, я пытаюсь понять шаблон, который я должен использовать для возврата данных, поскольку фактически не существует очевидного синхронного способа возврата фактического результата. На самом деле, очевидно, что по крайней мере два потока выполняются на вызов метода ocEngine.ReadImage (image); У меня есть работа с Thread.Sleep и проверкой логического значения, но это кажется неправильным.

Любое руководство будет с благодарностью.

1 Ответ

0 голосов
/ 21 ноября 2018

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

static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
public static string Process(Bitmap image)
{
   ...
   int result = ocEngine.ReadImage(image);
   autoResetEvent.WaitOne(2500);
   ...
}

затем в событии обратного вызова:

autoResetEvent.Set();

как только работа будет завершена.

Однако этот подход дал более согласованные результаты, и, возможно, это было результатом использования API, который иногда вызывал проблемы тайм-аута / тупика.

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