正在强制web请求等待事件回调

本文关键字:等待 事件 回调 请求 web | 更新日期: 2023-09-27 18:00:15

我有一个web请求(HttpRequest),它触发了我的服务器上的第三个库扫描方法,该方法附带了一个事件处理程序:

scanner.OnScanComplete += scanner_OnScanComplete;

web请求将调用scanner.Scan(files),但当扫描过程完成时,我如何强制(或挂起)请求等待并从scanner_OnScanComplete获取结果,以便它可以向客户端返回数据,而不必发送另一个web请求来获取这些数据?

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
}

正在强制web请求等待事件回调

您必须使用HttpHandler还是可以使用其他api?

如果您可以使用MVC4或更高版本,那么您可以使用异步操作方法轻松完成此操作。这里有一个如何使用它们的例子。

除了使用异步操作方法外,您可能还需要一种方法来等待来自扫描仪的事件。在这个答案中使用任务完成源可能是一个很好的方法。

执行所需操作的一种方法是将任务的完成情况存储在布尔成员中。布尔值应标记为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; 
}