我有一个网络请求(HttpRequest
),它在我的服务器上触发第三个库扫描方法,该方法附加了一个事件处理程序:
scanner.OnScanComplete += scanner_OnScanComplete;
Web请求将调用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 :(得分:0)
您是否必须使用HttpHandler或者您可以使用其他api?
如果您可以使用MVC4或更高版本,则可以使用异步Action方法轻松完成此操作。 Look here for an example of how to use them
除了使用异步操作方法之外,您还可能需要一种方法来等待扫描程序中的事件。使用任务完成源in this answer可能是一种很好的方法。
答案 1 :(得分: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;
}