/// <summary> Executes the analysis operation asynchronously, then returns either the /// result, or any exception that was thrown. </summary> /// <param name="frame"> The frame. </param> /// <returns> A Task<NewResultEventArgs> </returns> protected async Task<NewResultEventArgs> DoAnalyzeFrame(VideoFrame frame) { CancellationTokenSource source = new CancellationTokenSource(); // Make a local reference to the function, just in case someone sets // AnalysisFunction = null before we can call it. var fcn = AnalysisFunction; if (fcn != null) { NewResultEventArgs output = new NewResultEventArgs(frame); var task = fcn(frame); LogMessage("DoAnalysis: started task {0}", task.Id); try { if (task == await Task.WhenAny(task, Task.Delay(AnalysisTimeout, source.Token))) { output.Analysis = await task; source.Cancel(); } else { output.TimedOut = true; } } catch (Exception ae) { output.Exception = ae; } LogMessage("DoAnalysis: returned from task {0}", task.Id); return output; } else { return null; } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)