/// <summary> /// Processes any block analysis on the given block. /// </summary> /// <param name="block">The block.</param> public async void ProcessBlockAnalysis(Block block) { // If we don't have any analysis controllers, we don't have to do anything. if (BlockAnalyzers.Count == 0) { return; } // Keep track of the running tasks so we can wait for them to finish // (if needed). Interlocked.Increment(ref tasksRunning); try { // Grab information about the block inside a read lock. int blockVersion; HashSet <IBlockAnalyzerProjectPlugin> analysis; using (block.AcquireBlockLock(RequestLock.Read)) { blockVersion = block.Version; analysis = block.GetAnalysis(); } // Create a background task that will analyze the block. This will return // false if the block had changed in the process of analysis (which would // have triggered another background task). var analyzer = new BlockAnalyzer( block, blockVersion, BlockAnalyzers, analysis); Task task = Task.Factory.StartNew(analyzer.Run); // Wait for the task to complete in the background so we can then // decrement our running counter. await task; } finally { // Decrement the counter to keep track of running tasks. Interlocked.Decrement(ref tasksRunning); } }
/// <summary> /// Processes any block analysis on the given block. /// </summary> /// <param name="block">The block.</param> public async void ProcessBlockAnalysis(Block block) { // If we don't have any analysis controllers, we don't have to do anything. if (BlockAnalyzers.Count == 0) { return; } // Keep track of the running tasks so we can wait for them to finish // (if needed). Interlocked.Increment(ref tasksRunning); try { // Grab information about the block inside a read lock. int blockVersion; HashSet<IBlockAnalyzerProjectPlugin> analysis; using (block.AcquireBlockLock(RequestLock.Read)) { blockVersion = block.Version; analysis = block.GetAnalysis(); } // Create a background task that will analyze the block. This will return // false if the block had changed in the process of analysis (which would // have triggered another background task). var analyzer = new BlockAnalyzer( block, blockVersion, BlockAnalyzers, analysis); Task task = Task.Factory.StartNew(analyzer.Run); // Wait for the task to complete in the background so we can then // decrement our running counter. await task; } finally { // Decrement the counter to keep track of running tasks. Interlocked.Decrement(ref tasksRunning); } }