2015-06-29 2 views
0

У меня есть веб-запрос (HttpRequest), который запускает третий метод сканирования библиотеки на моем сервере, который имеет обработчик события к нему:Принуждение веб-запрос ждать обратного вызова события

scanner.OnScanComplete += scanner_OnScanComplete; 

веб-запрос Воле invoke scanner.Scan(files), но как я могу заставить (или перехватить) запрос на ожидание и получить результаты от scanner_OnScanComplete, когда процесс сканирования будет завершен, чтобы он мог возвращать данные клиентам без необходимости отправки другого веб-запроса для получения этих данных?

void DoWork(HttpRequst request, var files) 
{ 
var scanner = new Scanner() 
scanner.OnScanComplete += scanner_OnScanComplete; 
scan(files) 

} 

void scanner_OnScanComplete(object sender, EventArgs e) 
{ 

    var scanCompleted = true; 

    //Return scanCompleted somehow to the DoWork thread above 
} 
+0

Это не настоящий код, который так сложно помочь! 'новый сканер' без круглых скобок ?! Как «запрос» используется и т. Д.? Что такое «Сканер» и как работает «OnScanComplete» и т. Д. ?! – Belogix

+0

Нет реального кода, запрос не используется, это то, что я пытаюсь выяснить, я просто ставлю это как пример того, что мне нужно сделать, почему это трудно понять? – Maya

+0

Я добавил круглую скобку, теперь вы можете понять, что делает код? – Maya

ответ

0

Нужно ли использовать HttpHandler или использовать другие api?

Если вы можете использовать MVC4 или позже, вы можете использовать асинхронный метод действий, чтобы сделать это легко. Look here for an example of how to use them.

В дополнение к использованию метода асинхронных действий вам может потребоваться способ ожидания события от сканера. Использование источника завершения задачи как in this answer может быть хорошим способом сделать это.

0

Один из способов сделать то, что вы хотите, - это сохранить выполнение задачи в булевом элементе. Булево значение должно быть отмечено volatile, чтобы избежать проблем с нарезкой.

Риск подхода заключается в том, чтобы привести к таймаутам на стороне клиента, если обработка сканирования слишком велика.

private volatile bool _finished; 

void DoWork(HttpRequst request, var files) 
{ 
    var scanner = new Scanner(); 
    scanner.OnScanComplete += scanner_OnScanComplete; 

    _finished= false; 
    scan(files) 

    while (!_finished) // wait for the scan completion 
     System.Threading.Thread.Sleep(1000); // avoid consuming 100% cpu 

    var scanData = Dothescanwork(); 
    //Return scanData somehow to the DoWork thread above 
} 

void scanner_OnScanComplete(object sender, EventArgs e) 
{ 
    _finished= true; 
} 
+0

Это заблокирует поток, который выполняет запрос. Хотя это возможный вариант, это не рекомендуется. –

+0

@RuneGrimstad Кажется, это то, что она намеревалась сделать сначала. Без сомнения, есть лучший способ сделать это. – user3608483