【问题标题】:Forcing web request to wait for an event callback强制 Web 请求等待事件回调
【发布时间】:2015-06-29 12:47:17
【问题描述】:

我有一个 Web 请求 (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
}

【问题讨论】:

  • 这不是真正的代码,太难了! new Scanner 没有括号?! request 如何使用等? Scanner 是什么,OnScanComplete 是如何工作的等等?!
  • 没有真正的代码,请求没有被使用,这是我想弄清楚的,我只是把这个作为我需要做的一个例子,为什么这很难理解?
  • 我添加了括号,现在你可以弄清楚代码的作用了吗?

标签: c# multithreading events callback httphandler


【解决方案1】:

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

如果您可以使用 MVC4 或更高版本,那么您可以使用异步操作方法轻松完成此操作。 Look here for an example of how to use them.

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

【讨论】:

    【解决方案2】:

    做你想做的事情的一种方法是将任务的完成存储在一个布尔成员中。 布尔值应标记为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; 
    }
    

    【讨论】:

    • 这将锁定执行请求的线程。虽然这是一个可能的选项,但不建议这样做。
    • @RuneGrimstad 这似乎是她一开始打算做的事情。毫无疑问,有更好的方法来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多