public void ResponseArrived(CrawlerSqlResponse sqlResponse) { if (WaitingRequests.ContainsKey(sqlResponse.Guid)) { var resetEvent = WaitingRequests[sqlResponse.Guid]; WaitingRequests.Remove(sqlResponse.Guid); ResponsesCompleted.Add(sqlResponse.Guid, sqlResponse); resetEvent.Set(); } }
public Task <CrawlerSqlResponse> DoSqlRequest(string statement, string groupName) { var guid = Nanoid.Nanoid.Generate(); if (!IsTerminalAvailable(groupName)) { return(Task.FromResult(new CrawlerSqlResponse(guid) { HasFailed = true, Exception = new CrawlerNotFound("No crawlers available") })); } return(Task.Run(() => { var request = new CrawlerSqlRequest(guid, statement); var resetEvent = new ManualResetEvent(false); WaitingRequests.Add(guid, resetEvent); HubContext.Clients.Group(groupName).SendCoreAsync("sql", new object[] { request }); resetEvent.WaitOne(TimeSpan.FromMinutes(10)); resetEvent.Dispose(); if (ResponsesCompleted.ContainsKey(guid)) { var crawlerSqlResponse = ResponsesCompleted[guid]; ResponsesCompleted.Remove(guid); return crawlerSqlResponse; } return new CrawlerSqlResponse(guid) { HasFailed = true, Exception = new TimeoutException("The crawler didn't respond in time") }; })); }