正在强制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
}
您必须使用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;
}